调试程序语法错误相对容易解决,逻辑错误较难发现,这篇帖子主要提醒一个易忽略的地方------函数变量的代入和求解,以subs函数为例
subs函数一般用以替换变量,在简单表达式中,直接求解
例如:>> syms x y
>> y=x+2;
>> subs(y,x,2)
ans =
4
但表达式复杂时,仅为替换变量,并未计算,导致替换后的表达式虽实质是数,但以表达式存在,为后续计算带来不必要的麻烦
以一个牛顿迭代法程序为例(初始程序来源于坛友wx_w4U7kc57)
- clear
- clc
- syms x1 x2 x3
- f1=3*x1-cos(x2*x3)-1/2;
- f2=x1^2-81*(x2+0.1)^2+sin(x3)+1.06;
- f3=exp(-x1*x2)+20*x3+(10*pi-3)/3;
- f1=[f1 f2 f3];
- df=[diff(f1,'x1');diff(f1,'x2');diff(f1,'x3')];
- df1=conj(df');
- x0=[10 10 10];
- eps=0.00001;
- con=0;
- %其中x0为迭代初值eps为精度要求N为最大迭代步数con用来记录结果是否收敛
- for i=1:20
- f=subs(f1,{x1 x2 x3},{x0(1) x0(2) x0(3)});
- df=subs(df1,{x1 x2 x3},{x0(1) x0(2) x0(3)});
- x=x0-f/df;
- for j=1:length(x0)
- il(i,j)=x(j);
- end
- if norm(x-x0)<eps
- con=1;
- break;
- end
- x0=x;
- end
程序无语法错误,运行一直显示正忙
将
f=subs(f1,{x1 x2 x3},{x0(1) x0(2) x0(3)});
df=subs(df1,{x1 x2 x3},{x0(1) x0(2) x0(3)});
改为
f=vpa(subs(f1,{x1 x2 x3},{x0(1) x0(2) x0(3)}));
df=vpa(subs(df1,{x1 x2 x3},{x0(1) x0(2) x0(3)}));
后程序很快运行完毕,因此调试程序时,会有想不到的思维盲区,希望能为需要的人提供一点思路
只是个人见解,初次分享,有不足之处,还望各位坛友见谅和多多指正
|