怎么用Mathematica解方程组的实数解,而复数解省略如题,在用Mathematica解方程组时,方程组可能有实数解和复数解,但是我只关心实数解,即我只要实数解,复数解省略,同时将解方程组的实数解运用

来源:学生作业帮助网 编辑:作业帮 时间:2024/04/29 08:45:54
怎么用Mathematica解方程组的实数解,而复数解省略如题,在用Mathematica解方程组时,方程组可能有实数解和复数解,但是我只关心实数解,即我只要实数解,复数解省略,同时将解方程组的实数解运用

怎么用Mathematica解方程组的实数解,而复数解省略如题,在用Mathematica解方程组时,方程组可能有实数解和复数解,但是我只关心实数解,即我只要实数解,复数解省略,同时将解方程组的实数解运用
怎么用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解方程组的实数解,而复数解省略如题,在用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的第二部分.

代码如下:

Bsx11 = (30762. (1. x^2 - 0.414935 x z + 1. y^2 - 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 + 0.296927 x z + 1. y^2 + 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 + 31.2785 x z + 1. y^2 - 2.12708 y z - 

     2. z^2) Sqrt[x^2 + y^2 + z^3])/(1. x^2 + 1. y^2 + 1. z^3)^3;

ans = NSolve[{Bsx11 == 10, Bsy11 == 8, Bsz11 == -6}, {x, y, z}]

{X, Y, Z} = Table[Null, {i, 3}, {j, Length[ans]}]

For[i = 1; j = 1, i <= Length[ans], 

 i++, {a, b, c} = Im[{x, y, z} /. ans[[i]]]; 

 If[a <= 1/10^10 && b <= 1/10^10 && 

   c <= 1/10^10, {X[[j]], Y[[j]], Z[[j]]} = {x, y, z} /. ans[[i]]; j++]]

{x, y, z} = {X[[1 ;; j - 1]], Y[[1 ;; j - 1]], Z[[1 ;; j - 1]]}

Remove[X, Y, Z];(*清除不用的变量*)

因为是数值计算,按照虚部的绝对值小于或等于10^-10界定是不是实数,实际使用时可以改成自己想要的精度。这里得到的结果要这样引用:

x[[i]],y[[i]],z[[i]]为一组解,1<=i<=j-1,没有解时为空集,j-1为0。

maple是不错的选择,可能你为了计算连贯不愿换软件,随便选择吧。

还可以用Reduce选项为Reals,或者用别的函数如Nsolve等解出来后用Case或者Select筛选

mathematica解方程组解字母方程组的结果出现了好多条件,怎么才能只要a=,b= 变系数非线性常微分方程组用mathematica怎么求解? 怎么用mathematica求解含参微分方程组 怎么用Mathematica解方程组的实数解,而复数解省略如题,在用Mathematica解方程组时,方程组可能有实数解和复数解,但是我只关心实数解,即我只要实数解,复数解省略,同时将解方程组的实数解运用 怎么将Mathematica解方程组的解应用到后续的运算中啊?如题,怎么将Mathematica上一个方程组的解应用到后续的运算中.例如用Mathematica已经得到三元一次方程组2a+b+3c=13,2b-a=3,3b-c=3的解a=1,b=2,c=3,怎么 怎么用mathematica算函数的最大值 mathematica解方程组,结果还是原式子. 有关mathematica用Dsolve解偏微分方程组的格式如图,想解出偏微分方程的x,y,求Dsolve命令格式 用mathematica画微分方程的图像怎么画? 怎么用mathematica做这道函数题?我晕的~~~~ 用Mathematica计算20的阶乘怎么写 用mathematica画出动态的摆线图怎么画? 用mathematica怎么计算arcsin(1/50)的值如题 用Mathematica求常微分方程组的解 dx/dt +y=cost dy/dt+x=sint 求命令与结果T-T 怎么用Mathematica画出一列点 就是画出的点是竖着排列的 最好是Mathematica 5.0实现的怎么用Mathematica画出一列点 就是画出的点是竖着排列的 最好是Mathematica 5.0实现的 我用matlab或者mathematica解下面的方程组,等很久都解不出.该如何解呢?方程组如下:0.0246 - 0.8819589411557277/(d1 - d2) - 0.7669208183962849/d2 + 2.018787475394988/Sqrt[d2 + 5.505138077186528] == 0 && -0.0246 + 0.881958941155 mathematica解方程组 (循环,选择)想用mathematica解方程组:1不同情况,有的系数会变化,比如{ax+by=0,cx+dy=k}中的a会变化,比如:可取1,2,3,4,5..我想用一个循环就像c里的for,改变a【i】的值,定义数组a[ mathematica解微分方程组求解微分方程的命令,要求写成dy,dx那种形式,不要y',y''型的