Matlab:非线性方程求解器

时间:2016-02-14 02:44:33

标签: matlab

如何解决这些方程组并且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,但我不确定如何使用它们。

1 个答案:

答案 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);

只需使用不同的参数值,以达到问题的可容忍精度水平。