调试程序语法错误相对容易解决,逻辑错误较难发现,这篇帖子主要提醒一个易忽略的地方------函数变量的代入和求解,以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)}));
后程序很快运行完毕,因此调试程序时,会有想不到的思维盲区,希望能为需要的人提供一点思路
只是个人见解,初次分享,有不足之处,还望各位坛友见谅和多多指正
|