如何解决这些方程组并且matlab能找到解决方案?我正在为x1,x2,x3,x4,c1,c2,c3,c4求解。
syms c1 c2 c3 c4 x1 x2 x3 x4;
eqn1 = c1 + c2 + c3 + c4 == 2;
eqn2 = c1*x1 + c2*x2 + c3*x3 + c4*x4 == 0;
eqn3 = c1*x1^2 + c2*x2^2 + c3*x3^2 + c4*x4^2 == 2/3;
eqn4 = c1*x1^3 + c2*x2^3 + c3*x3^3 + c4*x4^3 == 0;
eqn5 = c1*x1^4 + c2*x2^4 + c3*x3^4 + c4*x4^4 == 2/5;
eqn6 = c1*x1^5 + c2*x2^5 + c3*x3^5 + c4*x4^5 == 0;
eqn7 = c1*x1^6 + c2*x2^6 + c3*x3^6 + c4*x4^6 == 2/7;
eqn8 = c1*x1^7 + c2*x2^7 + c3*x3^7 + c4*x4^7 == 0;
根据我的理解,matlab有fsolve,solve和linsolve,但我不确定如何使用它们。
答案 0 :(得分:1)
您有一个非线性方程组,因此您可以使用fsolve来找到解决方案。
首先,您需要创建变量fcn
的函数,例如x
,其中x
是带有初始点的向量。该函数根据当前向量x
定义输出向量。
您有八个变量,因此矢量x
将包含八个元素。让我们以这种方式重命名您的变量:
%x1 x(1) %c1 x(5)
%x2 x(2) %c2 x(6)
%x3 x(3) %c3 x(7)
%x4 x(4) %c4 x(8)
您的功能将如下所示:
function F = fcn(x)
F=[x(5) + x(6) + x(7) + x(8) - 2 ;
x(5)*x(1) + x(6)*x(2) + x(7)*x(3) + x(8)*x(4) ;
x(5)*x(1)^2 + x(6)*x(2)^2 + x(7)*x(3)^2 + x(8)*x(4)^2 - 2/3 ;
x(5)*x(1)^3 + x(6)*x(2)^3 + x(7)*x(3)^3 + x(8)*x(4)^3 ;
x(5)*x(1)^4 + x(6)*x(2)^4 + x(7)*x(3)^4 + x(8)*x(4)^4 - 2/5 ;
x(5)*x(1)^5 + x(6)*x(2)^5 + x(7)*x(3)^5 + x(8)*x(4)^5 ;
x(5)*x(1)^6 + x(6)*x(2)^6 + x(7)*x(3)^6 + x(8)*x(4)^6 - 2/7 ;
x(5)*x(1)^7 + x(6)*x(2)^7 + x(7)*x(3)^7 + x(8)*x(4)^7
];
end
您可以使用x
的初始值评估您的函数:
x0 = [1; 1; 1; 1; 1; 1; 1; 1];
F0 = fcn(x0);
使用x0
作为初始点,函数返回:
F0 =
2.0000
4.0000
3.3333
4.0000
3.6000
4.0000
3.7143
4.0000
现在你可以启动fsolve
,它会尝试找到一些向量x
,例如你的函数返回全零:
[x,fval]=fsolve(@fcn, x0);
你会得到这样的东西:
x =
0.7224
0.7224
-0.1100
-0.7589
0.3599
0.3599
0.6794
0.5768
fval =
-0.0240
0.0075
0.0493
0.0183
-0.0126
-0.0036
-0.0733
-0.0097
正如您所看到的,函数值实际上接近于零,但您可能已经注意到优化算法已停止,因为options.MaxFunEvals
中存储的函数评估步骤数量有限(默认情况下为{{1 }})。另一个可能的原因是800
中存储的迭代次数有限(默认为MaxIter
)。
使用参数400
:
options
现在你的输出要好得多:
options = optimset('MaxFunEvals',2000, 'MaxIter', 1000);
[x,fval]=fsolve(@fcn, x0, options);
只需使用不同的参数值,以达到问题的可容忍精度水平。