[已解决] matlab运行程序出现错误:未定义函数或者变量

[复制链接]
逐梦在今天 发表于 2020-11-24 17:50:09
本帖最后由 逐梦在今天 于 2020-11-24 17:59 编辑

一个计算程序如下:
  1. Ra=0.54;
  2. le=0.4;
  3. Bs=1.8;
  4. mr1=1/3;
  5. Um=220*sqrt(2);
  6. N2=200;
  7. NA=400;
  8. lamda=N2/NA;
  9. miu0=4*pi*1e-7;
  10. f=50;

  11. syms Bdc;
  12. theta=pi/8;   %设置不同的角大小
  13. y=((Ra*le*mr1*Bs)/(2*lamda*Um*NA*miu0))*(sin(acos((mr1*Bs-Bdc)/(mr1*Bs)))-((mr1*Bs-Bdc)/(mr1*Bs))*acos((mr1*Bs-Bdc)/(mr1*Bs)))-1==cos(theta);     
  14. z=solve(y,Bdc)
  15. Bdc=z;
  16. length(Bdc);

  17. for i=1:length(Bdc)
  18.     t=0:0.0001:0.02;
  19.     Be1(i,:)=-mr1*Bs*cos(2*pi*f*t)+Bdc(i)
  20.     Be2(i,:)=-mr1*Bs*cos(2*pi*f*t)-Bdc(i)
  21.     if 0<=Be1(i,:)&Be1(i,:)<(mr1*Bs+(2/15)*miu0)
  22.        He1(i,:)=(3*Be1(i,:))/(5*Bs+2*miu0)
  23.     else if (mr1*Bs+(2/15)*miu0)<=Be1(i,:)&Be1(i,:)<=Bs
  24.              He1(i,:)=(15*Be1(i,:)-5*Bs+2*miu0)/(15*miu0)
  25.         end
  26.     end
  27.     if 0<=Be2(i,:)&Be2(i,:)<(mr1*Bs+(2/15)*miu0)
  28.        He2(i,:)=(3*Be1(i,:))/(5*Bs+2*miu0)
  29.     else if (mr1*Bs+(2/15)*miu0)<=Be2(i,:)&Be2(i,:)<=Bs
  30.              He2(i,:)=(15*Be1(i,:)-5*Bs+2*miu0)/(15*miu0)
  31.         end
  32.     end
  33.     i1p(i,:)=0.5*(He1(i,:)+He2(i,:))*le/NA;
  34.     i2p(i,:)=0.5*(He1(i,:)-He2(i,:))*miu0/(mr1*Bs);
  35.    
  36. end

  37. figure (5)
  38. plot(t,i1p(1,:),'r')
复制代码




运行后出现的错误为
Undefined function or variable 'He1'.
Error in thetaqiu_zhiliu (line 48)
    i1p(i,:)=0.5*(He1(i,:)+He2(i,:))*le/NA;


疑问:He1不是有值了吗,为何说其未定义呢?

最佳答案


TouAkira 发表于 2020-11-25 00:26:42
逐梦在今天 发表于 2020-11-24 10:22
是18b版
”不要用连续比较 0 < 3 < 2 也是 true“没有明白,

就是告诉你,老老实实把形如 x ∈ ( lb, ub ) 的两侧判定拆开写成两个判定
  1. ( lb < x ) && ( x < ub )
复制代码

深蓝 举例告诉你"连写会出错,所以不要用连续比较"

比如 3 ∈ ( 0, 2 ) 这个两侧判定的结果应当是 false

但是连写会被系统当成
  1. ( 0 < 3 ) < 2
复制代码

由于前一个判断 0 < 3 的结果无论对错( 只能是false的0或true的1 ),结果都小于2,所以整体判定条件永远返回 true

还是那些说过很多遍的老话:
写代码请先把思路理顺并画出流程图,这样报错时可以自己逐行运行、并对照框图检查每步是否按照思路完成了既定运算;
另外就是循序渐进,论坛上很大比例的问题,归结起来就是"基本逻辑语法还没搞清、就光想怎么省事儿怎么写代码了"。

也就幸好MATLAB是个数学软件,顶多报错;换成在实验室接触试剂,这种一路莽的态度都是要出事故的。

5 条回复


深蓝孩童 发表于 2020-11-24 19:38:04
调试错误代码,在运行代码之前,运行: dbstop if error

不要用连续比较 0 < 3 < 2 也是 true

逐梦在今天 发表于 2020-11-24 22:22:03
深蓝孩童 发表于 2020-11-24 19:38
调试错误代码,在运行代码之前,运行: dbstop if error

不要用连续比较 0 < 3 < 2 也是 true ...

是18b版
”不要用连续比较 0 < 3 < 2 也是 true“没有明白,

TouAkira 发表于 2020-11-25 00:26:42
逐梦在今天 发表于 2020-11-24 10:22
是18b版
”不要用连续比较 0 < 3 < 2 也是 true“没有明白,

就是告诉你,老老实实把形如 x ∈ ( lb, ub ) 的两侧判定拆开写成两个判定
  1. ( lb < x ) && ( x < ub )
复制代码

深蓝 举例告诉你"连写会出错,所以不要用连续比较"

比如 3 ∈ ( 0, 2 ) 这个两侧判定的结果应当是 false

但是连写会被系统当成
  1. ( 0 < 3 ) < 2
复制代码

由于前一个判断 0 < 3 的结果无论对错( 只能是false的0或true的1 ),结果都小于2,所以整体判定条件永远返回 true

还是那些说过很多遍的老话:
写代码请先把思路理顺并画出流程图,这样报错时可以自己逐行运行、并对照框图检查每步是否按照思路完成了既定运算;
另外就是循序渐进,论坛上很大比例的问题,归结起来就是"基本逻辑语法还没搞清、就光想怎么省事儿怎么写代码了"。

也就幸好MATLAB是个数学软件,顶多报错;换成在实验室接触试剂,这种一路莽的态度都是要出事故的。
回复此楼

逐梦在今天 发表于 2020-11-25 09:10:48
TouAkira 发表于 2020-11-25 00:26
就是告诉你,老老实实把形如 x ∈ ( lb, ub ) 的两侧判定拆开写成两个判定

深蓝 举例告诉你"连写会出错 ...

问题已解决,感谢您的解答

逐梦在今天 发表于 2020-11-25 09:11:32
深蓝孩童 发表于 2020-11-24 19:38
调试错误代码,在运行代码之前,运行: dbstop if error

不要用连续比较 0 < 3 < 2 也是 true ...

感谢您的解答
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
热门教程
站长推荐
快速回复 返回顶部 返回列表