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

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

本版积分规则

2304

主题

7626

帖子

31

粉丝
快速回复 在线客服 返回列表 返回顶部