打印

(转)MATLAB调试程序,一个易忽略的地方

[复制链接]
259|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cooldog123pp|  楼主 | 2020-8-29 20:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调试程序语法错误相对容易解决,逻辑错误较难发现,这篇帖子主要提醒一个易忽略的地方------函数变量的代入和求解,以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)}));
后程序很快运行完毕,因此调试程序时,会有想不到的思维盲区,希望能为需要的人提供一点思路
只是个人见解,初次分享,有不足之处,还望各位坛友见谅和多多指正

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1859

主题

6466

帖子

30

粉丝