数学公式化简的问题

bandaoyu 2012-04-19 12:07:48

谁能帮我把这个地址http://wenku.baidu.com/view/ea02ff8a6529647d2728520c.html
里面的导数展开式的方程组中的参数s和t分别用x,y,z表示出来,也就是等式的左边是s和t:s=f(x,y,z),t=f(x,y,z)
为了在程序里面使用。
...全文
284 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
bandaoyu 2012-04-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
引用 5 楼 的回复:

引用 4 楼 的回复:

引用 3 楼 的回复:
设置几个变量
a = ( x2-x1 )*( x2-x1 ) + ( y2-y1 )*( y2-y1 ) + ( z2-z1 )*( z2-z1 )
b = ( x2-x1 )*( x4-x3 ) + ( y2-y1 )*( y4-y3 ) + ( z2-z1 )*( z4-z3 )
c = ( x1-x2……
[/Quote]

高手!!
bandaoyu 2012-04-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
设置几个变量
a = ( x2-x1 )*( x2-x1 ) + ( y2-y1 )*( y2-y1 ) + ( z2-z1 )*( z2-z1 )
b = ( x2-x1 )*( x4-x3 ) + ( y2-y1 )*( y4-y3 ) + ( z2-z1 )*( z4-z3 )
c = ( x1-x2 )*( x1-x3 ) + ( y1-y2 )*( y1-y3 ) + ( z1-z……
[/Quote]
回复很迅速~ 很好
jiuchang 2012-04-19
  • 打赏
  • 举报
回复
这个应该问学数学的同学
Alexander 2012-04-19
  • 打赏
  • 举报
回复
抱歉,笔误,数组大小输错了:

#include<stdio.h>

typedef struct tagPoint
{
double x,y,z;
} Point;

void getResult(double*,double*,const Point[]);

int main()
{
Point points[4]={{0,0,0},{1,0,0},{0,1,0},{0,1,1}};
double s,t;

getResult(&s,&t,points);

system("cls");
printf("计算得到两个垂足分别为:\n[%5.2lf,%5.2lf,%5.2lf]\n[%5.2lf,%5.2lf,%5.2lf]\n",
points[0].x+(points[1].x-points[0].x)*s,points[0].y+(points[1].x-points[0].y)*s,points[0].z+(points[1].x-points[0].z)*s,
points[2].x+(points[3].x-points[2].x)*t,points[2].y+(points[3].x-points[2].y)*t,points[2].z+(points[3].x-points[2].z)*t);

return(0);
}

void getResult(double *s,double *t,const Point ps[])
{
double x[4][4],y[4][4],z[4][4],*p[3],a,b,c,d,e,f;
register int i,j;

for(i=0;i<3;i++)
for(j=i+1;j<4;j++)
{
x[i][j]=ps[i].x-ps[j].x;
y[i][j]=ps[i].y-ps[j].y;
z[i][j]=ps[i].z-ps[j].z;
}

p[0]=x,p[1]=y,p[2]=z;
a=b=c=e=f=0;

for(i=0;i<3;i++)
{
a+=p[i][0*4+1]*p[i][0*4+1]; //这里是用一维数组表示二维数组的方法:行号*总列数+列号,0*4+1即X[0][1],也就是X12
b+=p[i][0*4+1]*p[i][2*4+3];
c+=p[i][0*4+1]*p[i][0*4+2];
e+=p[i][2*4+3]*p[i][2*4+3];
f+=p[i][0*4+2]*p[i][2*4+3];
}

d=a*e-b*b;
*s=(c*e+b*f)/d;
*t=(a*f+b*c)/d;
}
Alexander 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 4 楼 的回复:

引用 3 楼 的回复:
设置几个变量
a = ( x2-x1 )*( x2-x1 ) + ( y2-y1 )*( y2-y1 ) + ( z2-z1 )*( z2-z1 )
b = ( x2-x1 )*( x4-x3 ) + ( y2-y1 )*( y4-y3 ) + ( z2-z1 )*( z4-z3 )
c = ( x1-x2 )*( x1-x3 )……
[/Quote]
简化方案:
1.注意b与d互为相反数,可以减少一个中间变量以减少计算量。
2.将d=-b代入方程组:
a*s-b*t=c
e*t-b*s=f
用行列式计算得:
s=(c*e+b*f)/(a*e-b*b)
t=(a*f+c*b)/(a*e-b*b)
注意s与t的分母是一样的,可以用一个临时变量存储以减少计算量:
d=a*e-b*b
PS:话说用行列式计算多元一次方程组的解时分母都一样,这个技巧也是通用的。
3.可以用三个矩阵保存需要重复计算的中间变量,统一记为Xij(X可以是x,y或z)
令Xij=Xi-Xj
这样既可以减少计算量,又方便扩展,活用指针还可以简化代码。

综合上面的内容可以写出代码:

#include<stdio.h>

typedef struct tagPoint
{
double x,y,z;
} Point;

void getResult(double*,double*,const Point[]);

int main()
{
Point points[4]={{0,0,0},{1,0,0},{0,1,0},{1,1,0}};
double s,t;

getResult(&s,&t,points);

system("cls");
printf("计算得到两个垂足分别为:\n[%5.2lf,%5.2lf,%5.2lf]\n[%5.2lf,%5.2lf,%5.2lf]\n",
points[0].x+(points[1].x-points[0].x)*s,points[0].y+(points[1].x-points[0].y)*s,points[0].z+(points[1].x-points[0].z)*s,
points[2].x+(points[3].x-points[2].x)*t,points[2].y+(points[3].x-points[2].y)*t,points[2].z+(points[3].x-points[2].z)*t);

return(0);
}

void getResult(double *s,double *t,const Point ps[])
{
double x[3][3],y[3][3],z[3][3],*p[3],a,b,c,d,e,f;
register int i,j;

for(i=0;i<2;i++)
for(j=i+1;j<3;j++)
{
x[i][j]=ps[i].x-ps[j].x;
y[i][j]=ps[i].y-ps[j].y;
z[i][j]=ps[i].z-ps[j].z;
}

p[0]=x,p[1]=y,p[2]=z;
a=b=c=e=f=0;

for(i=0;i<3;i++)
{
a+=p[i][0*3+1]*p[i][0*3+1]; //这里是用一维数组表示二维数组的方法:行号*总列数+列号,0*3+1即X[0][1],也就是X12
b+=p[i][0*3+1]*p[i][2*3+3];
c+=p[i][0*3+1]*p[i][0*3+2];
e+=p[i][2*3+3]*p[i][2*3+3];
f+=p[i][0*3+2]*p[i][2*3+3];
}

d=a*e-b*b;
*s=(c*e+b*f)/d;
*t=(a*f+b*c)/d;
}
SLSnake 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 3 楼 的回复:
设置几个变量
a = ( x2-x1 )*( x2-x1 ) + ( y2-y1 )*( y2-y1 ) + ( z2-z1 )*( z2-z1 )
b = ( x2-x1 )*( x4-x3 ) + ( y2-y1 )*( y4-y3 ) + ( z2-z1 )*( z4-z3 )
c = ( x1-x2 )*( x1-x3 ) + ( y1-y2 )*( y……
[/Quote]

你可以把你化简得帖上来,我就这水平了
Alexander 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
设置几个变量
a = ( x2-x1 )*( x2-x1 ) + ( y2-y1 )*( y2-y1 ) + ( z2-z1 )*( z2-z1 )
b = ( x2-x1 )*( x4-x3 ) + ( y2-y1 )*( y4-y3 ) + ( z2-z1 )*( z4-z3 )
c = ( x1-x2 )*( x1-x3 ) + ( y1-y2 )*( y1-y3 ) + ( z1-z……
[/Quote]
怎么不化简一下就直接贴上来了……

求t用加减消元比代入要简单些:
t=(a*f-c*d)/(a*e+b*d)
SLSnake 2012-04-19
  • 打赏
  • 举报
回复
设置几个变量
a = ( x2-x1 )*( x2-x1 ) + ( y2-y1 )*( y2-y1 ) + ( z2-z1 )*( z2-z1 )
b = ( x2-x1 )*( x4-x3 ) + ( y2-y1 )*( y4-y3 ) + ( z2-z1 )*( z4-z3 )
c = ( x1-x2 )*( x1-x3 ) + ( y1-y2 )*( y1-y3 ) + ( z1-z2 )*( z1-z3 )

d = -(( x2-x1 )*( x4-x3 ) + ( y2-y1 )*( y4-y3 ) + ( z2-z1 )*( z4-z3 ))
e = ( x4-x3 )*( x4-x3 )+ ( y4-y3 )*( y4-y3 )+ ( z4-z3 )*( z4-z3 )
f = ( x1-x3 )*( x4-x3 ) + ( y1-y3 )*( y4-y3 ) + ( z1-z3 )*( z4-z3 )

代到公式

a*s-b*t = c
d*s+e*t = f

中去计算
解方程可以得到
s = (e*c+b*f)/(a*e+b*d)
t = (f-d*(e*c+b*f)/(a*e+b*d))/e

代入a b c d e f计算所得值,得到结果
Renovate2012 2012-04-19
  • 打赏
  • 举报
回复
我就是数学系的,请问楼主你要化简成什么样子?
用C来写出?

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧