想用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
求助完整格式:出错代码和出错提示!!! 本帖最后由 牛小贱 于 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: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的范围逻辑性是否合理! 或设下预设值吧 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的范围,急啊 fcrack这个函数是你自己定义的吗 chybeyond 发表于 2013-9-9 14:25 static/image/common/back.gif
fcrack这个函数是你自己定义的吗
是的,裂纹的综合模型就是这样的,我想在程序中使用这个函数 竹语随风 发表于 2013-9-9 15:06 static/image/common/back.gif
是的,裂纹的综合模型就是这样的,我想在程序中使用这个函数
C:\Documents and Settings\Administrator\桌面 那你应该把fcrack贴出来,不然我们运行就出错 本帖最后由 牛小贱 于 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: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:13 static/image/common/back.gif
老师,我都程序都贴在上面了,我在这里
function dx=crackandliner(t,x,c,w)
就是这个模型这个程序我弄不对,我如果用简单的模型还是可以出来图的,就是这个分段的裂纹模型不知道怎么引用 不好意思,忘记了,我分析了一下出错的原因,在fcrack这个函数中你列出了四种情况,但是你写的函数刚好四种情况都没满足,也就是说f没有任何值,所以提示错误。在if最后再加一个else f=。。就可以了 本帖最后由 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:39 编辑
chybeyond 发表于 2013-9-9 15:34 static/image/common/back.gif
不好意思,忘记了,我分析了一下出错的原因,在fcrack这个函数中你列出了四种情况,但是你写的函数刚好四种 ...
老师,我就想引用这个函数不好意思,最后一个取值范围应该是3*pi/2-alfa到后面的值
页:
[1]
2