lin2009 发表于 2010-6-14 11:30:13

非线性方程组数值解的2种解法均不能得出全部的解

本帖最后由 lin2009 于 2010-6-14 11:33 编辑

方程组   
    z1^z2 = z1*(z2+I*z1);
    z1+z2 = (1+I*(3*I)^(1/3))*(1/2);
的解答已知的至少有2组,但maple只能找到其中的一组(下面的第一组)。
{z1 = -2.640759550+.4456431468*I, z2 = 2.780197157+.1788692362*I}
{z1 = -.620953573790683+I*.356275636896525, z2 = .760391181212152+I*.268236746344947}

问题和答案2的来源见下贴的11#和12#
http://forum.simwe.com/thread-936855-1-1.html

以下是分别用fsolve和solve来解答的程序
eqn1 := z1^z2 = z1*(z2+I*z1);
eqn2 := z1+z2 = (1+I*(3*I)^(1/3))*(1/2);

FS1 := fsolve({eqn1, eqn2}, {z1, z2})
FS2 := fsolve({eqn1, eqn2}, {z1, z2}, avoid = FS1)

S := solve({eqn1, eqn2}, {z1, z2});
s1 := evalf(S);
evalf(subs(s1, {eqn1, eqn2}));
allvalues(S);
s2 := {z1 = -0.620953573790683+I*0.356275636896525, z2 = 0.760391181212152+I*0.268236746344947};
evalf(subs(s2, {eqn1, eqn2}))

lin2009 发表于 2010-6-17 18:00:02

已用fsolve解出,共有4组解:不知大家还有没有更好的方法。
> s1 := fsolve({eqn1, eqn2}, {z1, z2}, complex, fulldigits);
{z1 = -0.6209535738 + 0.3562756368 I, z2 = 0.7603911812 + 0.2682367462 I}

> s2 := fsolve({eqn1, eqn2}, {z1, z2}, complex, avoid = {s1}, fulldigits);
{z1 = 0.8459875693 - 0.8081761391 I, z2 = -0.7065499619 + 1.432688522 I}

> s3 := fsolve({eqn1, eqn2}, {z1, z2}, complex, avoid = {s1, s2}, fulldigits);
   {z1 = 0.4524734861 + 2.002179805 I, z2 = -0.3130358787 - 1.377667422 I}
   
> s4 := fsolve({eqn1, eqn2}, {z1, z2}, complex, avoid = {s1, s2, s3}, fulldigits);
   {z1 = -2.640759550 + 0.4456431466 I, z2 = 2.780197158 + 0.1788692364 I}
   
> s5 := fsolve({eqn1, eqn2}, {z1, z2}, complex, avoid = {s1, s2, s3, s4})
原式输出

shamohu 发表于 2010-6-17 18:35:22

下面也是一组吧?用1stOpt算的:

z1 =0+0i, z2 = 0.139437607423148 + 0.624512383241703i;

lin2009 发表于 2010-6-17 21:37:53

3# shamohu
经验证
{z1 = 0, z2 = .139437607423148+.624512383241703*I}
是方程组的解,还有没有其它解呢。

怎么把它一网打尽呢?

wanglu 发表于 2010-6-17 22:48:15

将第二个式子带入第一个可简化求解,Forcal代码:
c: z2(z1) = (1+i*(3*i)^(1/3))*(1/2)-z1;
c: cz1(z1)= z1^z2(z1) - z1*(z2(z1)+i*z1);
c: absz1(z1)= abs;
f(x1,x2,y1,y2)= //函数定义
{
cz1(x1,x2),
GetCalByte(&y1,&y2)
};
mvar:
a=1, b=1, //变换初值,得到不同的解
array=new.free(),
i=XSLSF::netn, //也可以变换0.1,0.1两个值尝试
array.sys::GA,
printff{"\r\n初值a={1,r}, 初值b={2,r}, 实际迭代次数={3,i},误差={4,r}\r\nz1x={5,r},z1y={6,r},z2x={7,r},z2y={8,r}", a, b, i, absz1(x,y), x, y, z2(x,y), };
几组解:
初值a=1., 初值b=1., 实际迭代次数=10,误差=2.7755575615628914e-016
z1x=-0.62095357379878169,z1y=0.35627563689818542,z2x=0.76039118122192972,z2y=0.2682367463435178

初值a=0., 初值b=0., 实际迭代次数=0,误差=0.
z1x=0.,z1y=0.,z2x=0.13943760742314798,z2y=0.62451238324170322

初值a=1., 初值b=-1., 实际迭代次数=5,误差=7.1993148024852709e-014
z1x=0.84598756933692421,z1y=-0.80817613912306552,z2x=-0.70654996191377628,z2y=1.4326885223647687

初值a=1., 初值b=3., 实际迭代次数=9,误差=4.5498153246749828e-014
z1x=0.45247348603451981,z1y=2.0021798049449022,z2x=-0.31303587861137183,z2y=-1.377667421703199

初值a=1., 初值b=5., 实际迭代次数=6,误差=7.7475686966118219e-013
z1x=1.2689825765920968,z1y=4.5996065256791203,z2x=-1.1295449691689488,z2y=-3.9750941424374169

初值a=1., 初值b=7., 实际迭代次数=8,误差=4.9769702052493514e-014
z1x=1.9680856685532386,z1y=6.6375164068950596,z2x=-1.8286480611300906,z2y=-6.0130040236533562

初值a=1., 初值b=9., 实际迭代次数=11,误差=1.1457157353758233e-013
z1x=2.5858464044055864,z1y=8.4819624180205597,z2x=-2.4464087969824386,z2y=-7.8574500347788563

初值a=-3., 初值b=1., 实际迭代次数=8,误差=1.8820163294834461e-014
z1x=-2.6407595502911008,z1y=0.44564314682191952,z2x=2.7801971577142486,z2y=0.17886923641978369

wanglu 发表于 2010-6-17 22:54:08

本帖最后由 wanglu 于 2010-6-18 10:49 编辑

还可以画出函数图形看一下,接上面的代码,Forcal函数是:
fxy(x,y)=absz1(x,y);    //该函数为0的点表示有解

不过Forcal的图形比较难看些,用其他软件画的比较好哦。

图形显示,有好几个解的区域,在x[-5,-5], y[-5,-5]内似乎有7个解,但仔细观察,实际上是6个解。如图所示:

wanglu 发表于 2010-6-18 11:07:11

解的数目似乎是比较多的,以下又有几组解:

初值a=5., 初值b=15., 实际迭代次数=12,误差=5.194742904687428e-013
z1x=4.6559064647153292,z1y=15.017627138805365,z2x=-4.5164688572921809,z2y=-14.393114755563662

初值a=5., 初值b=20., 实际迭代次数=0,误差=3.2160831425154989e-012
z1x=5.9851703057210468,z1y=19.467779320390544,z2x=-5.8457326982978985,z2y=-18.84326693714884

初值a=5., 初值b=33., 实际迭代次数=26,误差=7.0396391771895948e-012
z1x=9.4344512076274096,z1y=31.726157166091831,z2x=-9.2950136002042623,z2y=-31.101644782850126

初值a=5., 初值b=44., 实际迭代次数=41,误差=7.6965989137534052e-011
z1x=12.12356407743566,z1y=41.840974617495519,z2x=-11.984126470012512,z2y=-41.216462234253818
页: [1]
查看完整版本: 非线性方程组数值解的2种解法均不能得出全部的解