Matlab:非线性Eq:错误

时间:2016-02-15 02:37:56

标签: matlab

我有上一个问题的代码,但是,这个代码类似,只添加了更多的方程式。但是,我收到错误,我不确定如何修复它。

链接到我之前的问题:Matlab: Nonlinear equation solver

    function F = fcn(x)

    F=[x(6) +          x(7)         + x(8)         + x(9)        + x(10)         - 2   ;
       x(6)*x(1)    +  x(7)*x(2)    + x(8)*x(3)    + x(9)*x(4)   + x(10)*x(5)          ;
       x(6)*x(1)^2  +  x(7)*x(2)^2  + x(8)*x(3)^2  + x(9)*x(4)^2 + x(10)*x(5)    - 2/3 ;
       x(6)*x(1)^3  +  x(7)*x(2)^3  + x(8)*x(3)^3  + x(9)*x(4)^3 + x(10)*x(5)          ;
       x(6)*x(1)^4  +  x(7)*x(2)^4  + x(8)*x(3)^4  + x(9)*x(4)^4 + x(10)*x(5)     -2/5 ;
       x(6)*x(1)^5  +  x(7)*x(2)^5  + x(8)*x(3)^5  + x(9)*x(4)^5 + x(10)*x(5)          ;
       x(6)*x(1)^6  +  x(7)*x(2)^6  + x(8)*x(3)^6  + x(9)*x(4)^6 + x(10)*x(5)     -2/7 ;
       x(6)*x(1)^7  +  x(7)*x(2)^7  + x(8)*x(3)^7  + x(9)*x(4)^7 + x(10)*x(5)          ;
       x(6)*x(1)^8  +  x(7)*x(2)^8  + x(8)*x(3)^8  + x(9)*x(4)^8 + x(10)*x(5)     -2/9 ;
       x(6)*x(1)^9  +  x(7)*x(2)^9  + x(8)*x(3)^9  + x(9)*x(4)^9 + x(10)*x(5)          

       ];

    end




clc
clear all;
format long

x0  = [0.9; 0.5; 0.1; -0.5; -0.9; 0.2; 0.4; 0.5; 0.4; 0.2]; %Guess

F0 = fcn(x0);

[x,fval]=fsolve(@fcn, x0) %solve without optimization

options = optimset('MaxFunEvals',10000, 'MaxIter', 10000); %optimization criteria

[x,fval]=fsolve(@fcn, x0, options) %solve with optimization

我得到的错误是:

使用vertcat时出错 连接的矩阵的尺寸不一致。

fcn中的错误(第4行)%这是来自函数脚本     F = [x(6)+ x(7)+ x(8)+ x(9)+ x(10)      - 2;

fcncall中的错误(第7行)%这是来自主脚本 F0 = fcn(x0);

2 个答案:

答案 0 :(得分:4)

这是我之前遇到的一个非常微妙的错误。在执行fcn时创建数组文字时,直接附加到数字并以空格开头的负号(如数组文字的第5行,第7行和第9行)将被视为一元运算符(即,-使数字为负数,不作为二进制减运算。因此,因为Matlab允许使用空格来分隔列,所以指示的行被解释为具有两列;第5行第1列为x(6)*x(1)^4 ... x(10)*x(5),第5行第2列为-2/5

因此,要么在三个数字之间放置一个空格,要么消除减号之间的所有空格。例如:

x(6)*x(1)^4  +  x(7)*x(2)^4  + x(8)*x(3)^4  + x(9)*x(4)^4 + x(10)*x(5)     - 2/5;

x(6)*x(1)^4  +  x(7)*x(2)^4  + x(8)*x(3)^4  + x(9)*x(4)^4 + x(10)*x(5)-2/5;

答案 1 :(得分:1)

这个问题不容易找到。在行末尾的减号之前不使用空格,您创建了一个包含两个元素而不是一个元素的行。举一个简单的例子比较一下:

>> [2 - 2]

ans =

     0

>> [2 -2]

ans =

     2    -2

>> [(2 -2)]

ans =

     0

现在已修正的代码版本:

  F=[x(6) +          x(7)         + x(8)         + x(9)        + x(10)         - 2   ;
   x(6)*x(1)    +  x(7)*x(2)    + x(8)*x(3)    + x(9)*x(4)   + x(10)*x(5)          ;
   x(6)*x(1)^2  +  x(7)*x(2)^2  + x(8)*x(3)^2  + x(9)*x(4)^2 + x(10)*x(5)    - 2/3 ; ...either set a space
   x(6)*x(1)^3  +  x(7)*x(2)^3  + x(8)*x(3)^3  + x(9)*x(4)^3 + x(10)*x(5)          ;
   (x(6)*x(1)^4  +  x(7)*x(2)^4  + x(8)*x(3)^4  + x(9)*x(4)^4 + x(10)*x(5)    -2/5); ...or use brackets
   x(6)*x(1)^5  +  x(7)*x(2)^5  + x(8)*x(3)^5  + x(9)*x(4)^5 + x(10)*x(5)          ; ...both fixes the problem
   x(6)*x(1)^6  +  x(7)*x(2)^6  + x(8)*x(3)^6  + x(9)*x(4)^6 + x(10)*x(5)    - 2/7 ;
   x(6)*x(1)^7  +  x(7)*x(2)^7  + x(8)*x(3)^7  + x(9)*x(4)^7 + x(10)*x(5)          ;
   x(6)*x(1)^8  +  x(7)*x(2)^8  + x(8)*x(3)^8  + x(9)*x(4)^8 + x(10)*x(5)    - 2/9 ;
   x(6)*x(1)^9  +  x(7)*x(2)^9  + x(8)*x(3)^9  + x(9)*x(4)^9 + x(10)*x(5)          ];