声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2923|回复: 21

[编程技巧] 想用if语句编写裂纹综合模型的程序,总出错,

[复制链接]
发表于 2013-9-5 22:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
本帖最后由 牛小贱 于 2014-5-28 23:10 编辑

我编写的程序如下,不知道为什么总出错,显示theta没有定义,初学MATLAB,请不吝赐教。谢谢代码:
  1. function f=fcrack(theta)
  2. alfa=pi/6;
  3. if -pi/2+alfa<=theta && theta<=pi/2-alfa
  4.     f=1;
  5. elseif pi/2-alfa<theta && theta<=pi/2+alfa
  6.     f=1/2+1/2*cos(pi*(theta-pi/2+alfa)./(2*alfa));
  7. elseif pi/2+alfa<theta && theta<=3*pi/2-alfa
  8.     f=0;
  9. elseif 3*pi/2-alfa<=theta && theta<3*pi/2+alfa
  10.     f=1/2+1/2*cos(pi*(theta-3*pi/2-alfa)./(2*alfa));   
  11. end
复制代码




回复
分享到:

使用道具 举报

发表于 2013-9-6 00:06 | 显示全部楼层
求助完整格式:出错代码和出错提示!!!
 楼主| 发表于 2013-9-6 09:22 | 显示全部楼层
本帖最后由 牛小贱 于 2014-5-28 23:12 编辑

??? Input argument "alfa" is undefined.

Error in ==> fcrack at 3
if -pi/2+alfa<=theta & theta<=pi/2-alfa

这是错误提示
我想将它调用到这个函数里面
  1. function dx=crackandliner(t,x,c,w)
  2. e=0.1;
  3. k=0.5;
  4. beta=0;
  5. phi0=0;
  6. alfa=pi/6;
  7. phi=atan(x(1)/x(3));
  8. theta=w*t+phi0+beta-phi;
  9. n=sin(w*t);
  10. m=cos(w*t);
  11. dx=zeros(4,1);
  12. dx(1)=x(2);
  13. dx(2)=e*w^2.*cos(w*t+phi0)-c*x(2)-x(1)+fcrack(theta)*k*m^2*x(1)...
  14.     +fcrack(theta)*k*n*m*x(3);
  15. dx(3)=x(4);
  16. dx(4)=e*w^2.*sin(w*t+phi0)-c*x(4)-x(3)+fcrack(theta)*k*n^2*x(3)...
  17.     +fcrack(theta)*k*n*m*x(1);
复制代码
主函数
  1. j=1;
  2.     c=0.15;
  3.     for w=0.1:0.01:3
  4.         x0=[0.01;0.01;0.01;0.01];
  5.         options=odeset;options.RelTol=1e-4;
  6.         [t,x]=ode45(@crackandliner,[0 400],x0,options,c,w);
  7.         p= sqrt((x(end-400:end,1).^2)+(x(end-400:end,3).^2));
  8.         Pmax(j,1)=max(p);
  9.         j=j+1;
  10.     end
  11. w=0.1:0.01:3;
  12. h=plot(w,Pmax);
  13. title('p-w图');
  14. xlabel('回转速度w');
  15. ylabel('振幅p');
复制代码


发表于 2013-9-6 15:02 | 显示全部楼层
本帖最后由 ChaChing 于 2013-9-6 15:03 编辑
1F=> 显示theta没有定义
3F=> Input argument "alfa" is undefined

是否有些冲突!?


到底LZ的版本是多少? 个人使用R2009a试跑下, 但出错提示不同呀!?

Error in ==> fcrack at 2
alfa=pi/6;

??? Output argument "f" (and maybe others) not assigned during call to
"C:\MATLABR11\work\fcrack.m>fcrack".

而这个错误乃因无返回值造成!
无返回值的原因, 检查下LZ的范围逻辑性是否合理! 或设下预设值吧
 楼主| 发表于 2013-9-9 12:53 | 显示全部楼层
ChaChing 发表于 2013-9-6 15:02
是否有些冲突!?

不懂 啊,老师,我用07版本,和2012b都试过了。主要是theta=w*t+phi0+beta-phi,phi=atan(x(1)/x(3));我不知道fcrack能不能去出theta的范围,急啊
发表于 2013-9-9 14:25 | 显示全部楼层
fcrack这个函数是你自己定义的吗
 楼主| 发表于 2013-9-9 15:06 | 显示全部楼层
chybeyond 发表于 2013-9-9 14:25
fcrack这个函数是你自己定义的吗

是的,裂纹的综合模型就是这样的,我想在程序中使用这个函数
 楼主| 发表于 2013-9-9 15:07 | 显示全部楼层
竹语随风 发表于 2013-9-9 15:06
是的,裂纹的综合模型就是这样的,我想在程序中使用这个函数

C:\Documents and Settings\Administrator\桌面
发表于 2013-9-9 15:07 | 显示全部楼层
那你应该把fcrack贴出来,不然我们运行就出错
 楼主| 发表于 2013-9-9 15:11 | 显示全部楼层
本帖最后由 牛小贱 于 2014-5-28 23:11 编辑
chybeyond 发表于 2013-9-9 15:07
那你应该把fcrack贴出来,不然我们运行就出错

这就是我定义的fcrack
  1. function f=fcrack(theta)
  2. alfa=pi/6;
  3. if -pi/2+alfa<=theta && theta<=pi/2-alfa
  4.     f=1;
  5. elseif pi/2-alfa<theta && theta<=pi/2+alfa
  6.     f=1/2+1/2*cos(pi*(theta-pi/2+alfa)./(2*alfa));
  7. elseif pi/2+alfa<theta && theta<=3*pi/2-alfa
  8.     f=0;
  9. elseif 3*pi/2-alfa<=theta && theta<3*pi/2+alfa
  10.     f=1/2+1/2*cos(pi*(theta-3*pi/2-alfa)./(2*alfa));   
  11. end
复制代码


 楼主| 发表于 2013-9-9 15:13 | 显示全部楼层
竹语随风 发表于 2013-9-9 15:11
这就是我定义的fcrack
function f=fcrack(theta)
alfa=pi/6;

老师,我都程序都贴在上面了,我在这里

function dx=crackandliner(t,x,c,w)
e=0.1;
k=0.5;
beta=0;
phi0=0;
alfa=pi/6;
phi=atan(x(1)/x(3));
theta=w*t+phi0+beta-phi;
n=sin(w*t);
m=cos(w*t);
dx=zeros(4,1);
dx(1)=x(2);
dx(2)=e*w^2.*cos(w*t+phi0)-c*x(2)-x(1)+fcrack(theta)*k*m^2*x(1)...
    +fcrack(theta)*k*n*m*x(3);
dx(3)=x(4);
dx(4)=e*w^2.*sin(w*t+phi0)-c*x(4)-x(3)+fcrack(theta)*k*n^2*x(3)...
    +fcrack(theta)*k*n*m*x(1);
引用了我定义的fcrack的函数
 楼主| 发表于 2013-9-9 15:15 | 显示全部楼层
竹语随风 发表于 2013-9-9 15:13
老师,我都程序都贴在上面了,我在这里

function dx=crackandliner(t,x,c,w)

就是这个模型这个程序我弄不对,我如果用简单的模型还是可以出来图的,就是这个分段的裂纹模型不知道怎么引用
发表于 2013-9-9 15:34 | 显示全部楼层
不好意思,忘记了,我分析了一下出错的原因,在fcrack这个函数中你列出了四种情况,但是你写的函数刚好四种情况都没满足,也就是说f没有任何值,所以提示错误。在if最后再加一个else f=。。就可以了

评分

1

查看全部评分

发表于 2013-9-9 16:01 | 显示全部楼层
本帖最后由 ChaChing 于 2013-9-9 16:34 编辑

可能个人在4F没说清楚吧!?
而这个错误乃因无返回值造成!
无返回值的原因, 检查下LZ的范围逻辑性是否合理! 或设下预设值吧

基本就是13F所说的, 不过建议LZ需谨慎使用预设值(类似13F提供的)

逻辑范围在 -pi/3~pi*5/3, LZ确定theta都在这范围吗?
建议LZ了解下atan,atan2,angle等函数间的差异
 楼主| 发表于 2013-9-9 16:12 | 显示全部楼层
本帖最后由 竹语随风 于 2013-9-9 16:39 编辑
chybeyond 发表于 2013-9-9 15:34
不好意思,忘记了,我分析了一下出错的原因,在fcrack这个函数中你列出了四种情况,但是你写的函数刚好四种 ...



老师,我就想引用 QQ截图20130909150454.jpg 这个函数不好意思,最后一个取值范围应该是3*pi/2-alfa到后面的值



您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-9 20:34 , Processed in 0.079519 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表