=>シュミットの正規直交化を行いたい
[1.2] どのように取り組んだか
=>下記参照
[1.3] どのようなエラーやトラブルで困っているか
=>プログラムは完成したがもっとsmartにしたい
[1.4] 今何がわからないのか、知りたいか
=>力技が多い(printf etc...の多用など)ので
それらをfor文や関数で表記し
より分かりやすいプログラムにしたい
#include<stdio.h>
#include<float.h>
#include<math.h>
typedef struct vector{
float x;
float y;
float z;
} VECTOR;
float naiseki(VECTOR *p,VECTOR *q);
float schmidt(VECTOR *p,VECTOR *q);
float normalize(VECTOR *p);
float main(void)
{
VECTOR x1,x2,x3,a,b;
float i,j,k;
printf("\n");
printf("3次ベクトルx1,x2,x3を入力してください.\n\n");
printf("x1_x=");
scanf("%f",&x1.x);
printf("x1_y=");
scanf("%f",&x1.y);
printf("x1_z=");
scanf("%f",&x1.z);
printf("\n");
printf("x2_x=");
scanf("%f",&x2.x);
printf("x2_y=");
scanf("%f",&x2.y);
printf("x2_z=");
scanf("%f",&x2.z);
printf("\n");
printf("x3_x=");
scanf("%f",&x3.x);
printf("x3_y=");
scanf("%f",&x3.y);
printf("x3_z=");
scanf("%f",&x3.z);
printf("\n");
printf("x1=(%f,%f,%f)\n",x1.x,x1.y,x1.z);
printf("x2=(%f,%f,%f)\n",x2.x,x2.y,x2.z);
printf("x3=(%f,%f,%f)\n",x3.x,x3.y,x3.z);
printf("\n");
printf("内積x1*x2=%f\n",naiseki(&x1,&x2));
printf("内積x2*x3=%f\n",naiseki(&x2,&x3));
printf("内積x3*x1=%f\n",naiseki(&x3,&x1));
a.x=x2.x-schmidt(&x1,&x2)*x1.x;
a.y=x2.y-schmidt(&x1,&x2)*x1.y;
a.z=x2.z-schmidt(&x1,&x2)*x1.z;
b.x=x3.x-(schmidt(&x1,&x3)*x1.x)-(schmidt(&a,&x3)*a.x);
b.y=x3.y-(schmidt(&x1,&x3)*x1.y)-(schmidt(&a,&x3)*a.y);
b.z=x3.z-(schmidt(&x1,&x3)*x1.z)-(schmidt(&a,&x3)*a.z);
printf("\n");
printf("3次ベクトルx1,x2,x3に対する直交基底v1,v2,v3は以下です.\n");
printf("v1=(%f,%f,%f)\n",x1.x,x1.y,x1.z);
printf("v2=(%f,%f,%f)\n",a.x,a.y,a.z);
printf("v3=(%f,%f,%f)\n",b.x,b.y,b.z);
printf("\n");
i=normalize(&x1);
j=normalize(&a);
k=normalize(&b);
x1.x=x1.x/i;
x1.y=x1.y/i;
x1.z=x1.z/i;
a.x=a.x/j;
a.y=a.y/j;
a.z=a.z/j;
b.x=b.x/k;
b.y=b.y/k;
b.z=b.z/k;
printf("3次ベクトルx1,x2,x3に対する正規直交基底u1,u2,u3は以下です.\n");
printf("u1=(%f,%f,%f)\n",x1.x,x1.y,x1.z);
printf("u2=(%f,%f,%f)\n",a.x,a.y,a.z);
printf("u3=(%f,%f,%f)\n",b.x,b.y,b.z);
printf("\n");
return(0);
}
float naiseki(VECTOR *p,VECTOR *q)
{
float naiseki;
naiseki= p->x*q->x+p->y*q->y+p->z*q->z;
return(naiseki);
}
float schmidt (VECTOR *p,VECTOR *q)
{
float schmidt;
schmidt=((p->x*q->x)+(p->y*q->y)+(p->z*q->z))/((p->x*p->x)+(p->y*p->y)+(p->z*p->z));
return(schmidt);
}
float normalize(VECTOR *p)
{
float normalize;
normalize=sqrt((p->x*p->x)+(p->y*p->y)+(p->z*p->z));
return(normalize);
}