我不明白为什么Scilab会给我"语法错误,出乎意料;"

时间:2017-09-10 20:08:56

标签: matrix scilab

好吧,我得到了这个Newton的方法,用于多个变量代码,由我修改为4个变量而不是2个变量,但我一直得到错误

  

语法错误,意外;

参考第9行,它是函数F上方程的偏导数的雅可比矩阵。每个" "是另一个专栏,每一个&#34 ;;"是另一条线。

clear;clc
function z=F(p1,p2,p3,p4) 
    z(1)=0.3*(500-p1)^0.5-0.2*(p1-p2)^0.5+0.2*(p1-p3)^0.5
    z(2)=0.2*(p1-p2)^0.5-0.1*(p2-p4)^0.5+0.2*(p2-p3)^0.5
    z(3)=0.1*(p1-p3)^0.5-0.2*(p3-p2)^0.5+0.1*(p3-p4)^0.5
    z(4)=0.1*(p2-p4)^0.5+0.1*(p3-p4)^0.5-0.2*(p4)^0.5
endfunction
function z=J(p1,p2,p3,p4) //Jacobiano
    z=[-0.3/(2*sqrt(500-p1))-0.2/(2*sqrt(p1-p2))+0.2/(2*sqrt(p1-p3)) 0.2/(2*sqrt(p1-p2)) -0.2/(2*sqrt(p1-p3)) 0;0.2/(2*sqrt(p1-p2)) -0.2/(2*sqrt(p1-p2))-0.1/(2*sqrt(p2-p4))+0.2/(2*sqrt(p2-p3) -0.2/(2*sqrt(p2-p3)) -0.1/(2*sqrt(p2-p4));0.1/(2*sqrt(p1-p3)) 0.2/(2*sqrt(p3-p2)) -0.1/(2*sqrt(p1-p3))-0.2/(2*sqrt(p3-p2))+0.1(2*sqrt(p3-p4)) -0.1/(2*sqrt(p3-p4));0 0.1/(2*sqrt(p2-p4)) 0.1/(2*sqrt(p3-p4)) -0.1/(2*sqrt(p2-p4))-0.1/(2*sqrt(p3-p4))-0.2/(2*sqrt(p4))]
endfunction

代码并没有在这里结束,但错误肯定是我在4x4雅可比矩阵或函数本身中使用的格式,我只是不明白为什么是错误的。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您忘记关闭第9行第191行中的括号,并且您还忘记了第319行的操作符。

如果您正在创建一个矩阵,其中元素是操作的结果,您最好使用逗号而不是空格来分隔它们。您还应该使用#include <string> #include <functional> struct Widget {}; bool test(int ); bool test(Widget ); void invok(std::function<bool(int)> ); // #1 void invok(std::function<bool(std::string)> ); // #2 int main() { // error: unresolved overloaded function type // invok(test); // still error: no known conversion from std::string to // int or Widget invok([](auto&& x) { return test(std::forward<decltype(x)>(x)); }); } 来打破多行中的矩阵定义,以提高可读性。如果它是这样编写的,你的雅可比函数将更容易调试:

...

在这种风格中,您可以轻松发现错误:注意第8行中缺少的function z=J(p1,p2,p3,p4) //Jacobiano z=[-0.3/(2*sqrt(500-p1))-0.2/(2*sqrt(p1-p2))+0.2/(2*sqrt(p1-p3)),... 0.2/(2*sqrt(p1-p2)),... -0.2/(2*sqrt(p1-p3)),... 0;... ... 0.2/(2*sqrt(p1-p2)),... -0.2/(2*sqrt(p1-p2))-0.1/(2*sqrt(p2-p4))+0.2/(2*sqrt(p2-p3),... -0.2/(2*sqrt(p2-p3)),... -0.1/(2*sqrt(p2-p4));... ... 0.1/(2*sqrt(p1-p3)),... 0.2/(2*sqrt(p3-p2)),... -0.1/(2*sqrt(p1-p3))-0.2/(2*sqrt(p3-p2))+0.1(2*sqrt(p3-p4)),... -0.1/(2*sqrt(p3-p4));... ... 0,... 0.1/(2*sqrt(p2-p4)),... 0.1/(2*sqrt(p3-p4)),... -0.1/(2*sqrt(p2-p4))-0.1/(2*sqrt(p3-p4))-0.2/(2*sqrt(p4))] endfunction 和第14行中缺少的)