作业帮 > 数学 > 作业

怎么用Mathematica解方程组的实数解,而复数解省略

来源:学生作业帮 编辑:百度作业网作业帮 分类:数学作业 时间:2024/06/13 00:20:48
怎么用Mathematica解方程组的实数解,而复数解省略
如题,在用Mathematica解方程组时,方程组可能有实数解和复数解,但是我只关心实数解,即我只要实数解,复数解省略,同时将解方程组的实数解运用到后续的计算中.例如Bsx11 =(30762.(1.x^2 + 1.y^2 - 0.414935 x z - 1.87042 y z - 2.z^2) Sqrt[
x^2 + y^2 + z^3])/(1.x^2 + 1.y^2 + 1.z^3)^3,Bsy11 =(19247.5 (1.x^2 + 1.y^2 + 0.296927 x z + 4.82508 y z - 2.z^2) Sqrt[
x^2 + y^2 + z^3])/(1.x^2 + 1.y^2 + 1.z^3)^3,Bsz11 =(3476.86 (1.x^2 + 1.y^2 + 31.2785 x z - 2.12708 y z - 2.z^2) Sqrt[
x^2 + y^2 + z^3])/(1.x^2 + 1.y^2 + 1.z^3)^3,用mathematica解方程组NSolve[{Bsx11 == 10,
Bsy11 == 8,
Bsz11 == -6},{x,y,z}]得到的解中实数解和复数解,即解为{{x -> 152.113 + 4.40379 I,y -> -48.0508 - 1.39111 I,
z -> -29.8466 - 0.864082 I},{x -> 152.113 - 4.40379 I,
y -> -48.0508 + 1.39111 I,
z -> -29.8466 + 0.864082 I},{x -> 136.626,y -> -43.1587,
z -> -26.8079},{x -> 14.616,y -> -4.61705,
z -> -2.86787},{x -> -12.4951,y -> 3.94707,
z -> 2.45171},{x -> -1.14246 - 1.29199 I,
y -> 0.360891 + 0.408124 I,
z -> -3.20177 - 3.62082 I},{x -> -1.14246 + 1.29199 I,
y -> 0.360891 - 0.408124 I,
z -> -3.20177 + 3.62082 I},{x -> 0.687609 - 1.55505 I,
y -> -0.217208 + 0.491225 I,
z -> 1.92704 - 4.35808 I},{x -> 0.687609 + 1.55505 I,
y -> -0.217208 - 0.491225 I,
z -> 1.92704 + 4.35808 I},{x -> 1.41575 - 0.924249 I,
y -> -0.44722 + 0.29196 I,
z -> 3.96768 - 2.59023 I},{x -> 1.41575 + 0.924249 I,
y -> -0.44722 - 0.29196 I,z -> 3.96768 + 2.59023 I}},而我只需要实数解才有意义,故只要实数解,并且需要将实数解运用到后续的计算中,也就说得到实数解了,怎么将实数解提取出来并用到后续的计算中.小弟我十分感谢.
liwenwei1980的回答,你的实数解怎么只有一个啊,用Mathematica解出来的解中有三个实数解啊。这是什么原因啊。如果方便的话,
怎么用Mathematica解方程组的实数解,而复数解省略
关于一个解和三个解的问题:
maple里面解方程和不等式有两个命令,solve(),fsolve(),前者是符号解,后者是数值解.对于输入为浮点型的数据的方程、不等式,前者的结果仍然以数值表示,但是仍然用符号解法.当然,数值解法要快很多.不过,如果你在本科阶段学过计算方法的课程就应该知道,对于“病态方程”,数值解法可能会遗漏一些解——除非你事先知道解的分布情况(比如通过图像法先确定这些解大致分布在什么范围)而分别在指定的区间进行计算才可以求出所有解.之前给出的求解命令是采用的数值解法,用的fsolve()函数,不到1秒钟就借出来,但是只有一个解,如果采用符号解,把最后一步改为solve({Bsx11 = 10,Bsy12 = 8,Bsz13 = -6},{x,y,z}); 计算时间达到16秒,会求出3组解,如下:
{x = -12.49511224,y = 3.947047229,z = 2.451708183},
{x = 14.61605193,y = -4.617025136,z = -2.867864926},
{x = 136.6263204,y = -43.15851903,z = -26.80791188}
如果不限定在实数范围内求解,会有11组解,但是求解事件只有14秒.
所以,从效率方面考虑,直接用计算机本来的函数求实数解,效率并不高.另外,由于你所给定的数据都是浮点型,说明原始数据本来就有误差,那么,如果求出的一组解是虚数解,但是虚部很小,比如x=1.30645+i*0.0000001,是不是也应该考虑把它作为一组实数解来处理?那就应该采用“zsy312”提出的方法,先把所有复数解求出来,在筛选实数解或者虚部较小的虚数解(虽然这里的结果虚部都不小,用不上).(不管在maple还是mathematica上实现都很容易.)
个人比较喜欢用maple是因为maple的运行效率较高,在比较低的配置的计算机上都可以运行(Mathematica不行),而且,各种函数的表达方式符合我们的习惯(用小括号表示函数——这是绝大多数常用的计算机高级语言的惯例,也是我们的数学书籍上的表示方法,函数名一般不用大写——除非不想求值而只是想显示出来,对公式的显示很漂亮,和教科书上一致).以前我也是用mathematica的,后来转向maple.由于两者的函数名大多一致,转换很容易.(只需注意大小写括号、赋值号、等号、结束符号的差别皆可,多数情况下,把mathematica的程序修改大小写和括号,每句结束后添上分号,即可拿到maple上运行)从网上找的的资料看,mathematica的功能也是很强大的,到目前为止,它是商业化运作最好的符号计算软件.
另外,像reduce,mamxima,xcas,yacas,axiom这些开源软件也还不错,不用担心版权问题,功能丝毫不逊色,由于是开源软件,对系统配置的要求都不高,以前大多只有linux版本,现在也有windows版本了.有一个回答中就提到可以在reduce中实现相同的功能.
干嘛非要在Mathenmatica中计算?用maple不是更好吗?在maple里要找一个函数、命令的介绍为非常简单,只要输入“?solve;”即可查看解方程(不等式)的函数“solve”的详细信息,然后找你关心的实数根的信息,可以看到有“RealDomain ”,再查“RealDomain ”的介绍,马上就知道用法.
在maple里面,只要加一句“with( RealDomain ); ”即可限定在实数域中处理,你的这个方程组,在maple中只需要把如下代码拷贝过去即可:
with( RealDomain );
Bsx11:=30762*(x^2 + y^2 - 0.414935*x*z - 1.87042*y*z - 2*z^2)*sqrt(
x^2 + y^2 + z^3)/( x^2 +y^2 +z^3)^3;
Bsy12:=19247.5*(x^2 + y^2 + 0.296927*x*z + 4.82508*y*z - 2*z^2)*(x^2 + y^2 +z^3)^(-5/2);
Bsz13:=3476.86*(x^2 + y^2 + 31.2785*x*z - 2.12708*y*z - 2*z^2)*(x^2 + y^2 +z^3)^(-5/2);
fsolve({Bsx11 = 10,Bsy12 = 8,Bsz13 = -6},{x,y,z});
运行结果只有一个:
{x = -12.49511224,y = 3.947047229,z = 2.451708183}
如果你能够确信方程有且仅有一组实数解,后续还要引用这个结果的话,那么可以把最后一句改为:
S0:=fsolve({Bsx11 = 10,Bsy12 = 8,Bsz13 = -6},{x,y,z});
后面引用时op(2,S0[1])、op(2,S0[3])、op(2,S0[3])就分别代表该方程组的解的三个数值,op(2,S0[1])即是-12.49511224.S0[1]表示“x = -12.49511224”这个等式,而不是-12.49511224.op(2,exp)表示表达式exp的第二部分.