竹语随风 发表于 2013-9-5 22:27

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

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

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



ChaChing 发表于 2013-9-6 00:06

求助完整格式:出错代码和出错提示!!!

竹语随风 发表于 2013-9-6 09:22

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

ChaChing 发表于 2013-9-6 00:06 static/image/common/back.gif
求助完整格式:出错代码和出错提示!!!
??? Input argument "alfa" is undefined.

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

这是错误提示
我想将它调用到这个函数里面
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);主函数
j=1;
    c=0.15;
    for w=0.1:0.01:3
      x0=;
      options=odeset;options.RelTol=1e-4;
      =ode45(@crackandliner,,x0,options,c,w);
      p= sqrt((x(end-400:end,1).^2)+(x(end-400:end,3).^2));
      Pmax(j,1)=max(p);
      j=j+1;
    end
w=0.1:0.01:3;
h=plot(w,Pmax);
title('p-w图');
xlabel('回转速度w');
ylabel('振幅p');

ChaChing 发表于 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 static/image/common/back.gif
是否有些冲突!?




不懂 啊,老师,我用07版本,和2012b都试过了。主要是theta=w*t+phi0+beta-phi,phi=atan(x(1)/x(3));我不知道fcrack能不能去出theta的范围,急啊

chybeyond 发表于 2013-9-9 14:25

fcrack这个函数是你自己定义的吗

竹语随风 发表于 2013-9-9 15:06

chybeyond 发表于 2013-9-9 14:25 static/image/common/back.gif
fcrack这个函数是你自己定义的吗

是的,裂纹的综合模型就是这样的,我想在程序中使用这个函数

竹语随风 发表于 2013-9-9 15:07

竹语随风 发表于 2013-9-9 15:06 static/image/common/back.gif
是的,裂纹的综合模型就是这样的,我想在程序中使用这个函数

C:\Documents and Settings\Administrator\桌面

chybeyond 发表于 2013-9-9 15:07

那你应该把fcrack贴出来,不然我们运行就出错

竹语随风 发表于 2013-9-9 15:11

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

chybeyond 发表于 2013-9-9 15:07 static/image/common/back.gif
那你应该把fcrack贴出来,不然我们运行就出错
这就是我定义的fcrack
function f=fcrack(theta)
alfa=pi/6;
if -pi/2+alfa<=theta && theta<=pi/2-alfa
    f=1;
elseif pi/2-alfa<theta && theta<=pi/2+alfa
    f=1/2+1/2*cos(pi*(theta-pi/2+alfa)./(2*alfa));
elseif pi/2+alfa<theta && theta<=3*pi/2-alfa
    f=0;
elseif 3*pi/2-alfa<=theta && theta<3*pi/2+alfa
    f=1/2+1/2*cos(pi*(theta-3*pi/2-alfa)./(2*alfa));   
end

竹语随风 发表于 2013-9-9 15:13

竹语随风 发表于 2013-9-9 15:11 static/image/common/back.gif
这就是我定义的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 static/image/common/back.gif
老师,我都程序都贴在上面了,我在这里

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


就是这个模型这个程序我弄不对,我如果用简单的模型还是可以出来图的,就是这个分段的裂纹模型不知道怎么引用

chybeyond 发表于 2013-9-9 15:34

不好意思,忘记了,我分析了一下出错的原因,在fcrack这个函数中你列出了四种情况,但是你写的函数刚好四种情况都没满足,也就是说f没有任何值,所以提示错误。在if最后再加一个else f=。。就可以了

ChaChing 发表于 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 static/image/common/back.gif
不好意思,忘记了,我分析了一下出错的原因,在fcrack这个函数中你列出了四种情况,但是你写的函数刚好四种 ...


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



页: [1] 2
查看完整版本: 想用if语句编写裂纹综合模型的程序,总出错,