sigmai西装定制-西装定制 知乎
麻烦看一下这个matlab写的程序错在哪里
问题分析
?
你的这段程序问题太多了,条件说的也不够清楚,所以,分析很大程度上靠猜测:
1、程序中有多处sigma应为字母f(出现在12处,共计16个),例如:
isigma-->? if(4处)
sigmaprintsigma? -->?fprintf?(2处)
osigmasigma-->? off?(2处) sigmasolve? -->?fsolve?(2处) oversigmalow? -->? overflow?(2处)我感到非常奇怪,为什么会出现这样的错误?
2、函数开始处:
function[x,y]=Solvequation(a,DB,sigma,r,tau)if?C>=DB
a=C;
else
a=DB;
end 存在两个问题:
(1)C被使用但未定义;
(2)被传入的参数a根本没有用到。
怀疑被传入的第一个参数应该是C而不是a,即函数定义应为
function[x,y]=Solvequation(C,DB,sigma,r,tau)3、调用函数的数据没说清楚。按照你所给的数据:
σE=1.03402127, E=6852804951,r=3.25%,τ=1, B=195162000 σE =0.43666672, E=2503241663,r=3.25%,τ=1,B=3155000000这些符号与函数Solvequation的输入参数(C,DB,sigma,r,tau)并不能很清晰地对应。猜测可能按照下面的对应关系:
σE? -->? sigma
E? -->? C r? -->? r τ? -->? tau B? --> ?DB如果按照这样对应关系调用函数,得到的结果分别是:
(1)第一组数据
overflow!Too?small.x?=
0.2880
y?=
3.7690e+010
(2)第二组数据
x?=0.2000
y?=
1.0932e+010
参考代码
修改后的函数以及调用代码如下(可保存在一个M文件中运行):
function?zd918361556824217139sigma=1.03402127;
C=6852804951;
r=3.25;
tau=1;
DB=195162000;
[x,y]=Solvequation(C,DB,sigma,r,tau)
sigma?=0.43666672;
C=2503241663;
r=3.25;
tau=1;
DB=3155000000;
[x,y]=Solvequation(C,DB,sigma,r,tau)
function[x,y]=Solvequation(C,DB,sigma,r,tau)
if?C>=DB
a=C;
else
a=DB;
end
y=a/2;w=a/10;eye=a/1000;N=50;
h1=0;h2=1e+5;
max=w*N+y;
while?w>=eye
J=0;
while?max>=y
J=J+1;
%equation?1
x1=fsolve(@(x)x*y*quadl('exp(-t.^2/2)/sqrt(2*pi)',0,(log(y/DB)+x.^2*tau/2+r*tau)/(x.*tau^0.5))-C*sigma,0.2,optimset('display','off'));
%equation?2
x2=fsolve(@(x)DB*exp(-r*tau)*quadl('exp(-t.^2/2)/sqrt(2*pi)',0,(log(y/DB)-x.^2*tau/2+r*tau)/(x*tau^0.5))-y*quadl('exp(-t.^2/2)/sqrt(2*pi)',0,(log(y/DB)+x.^2*tau/2+r*tau)/(x*tau^0.5))+C,0.2,optimset('display','off'));
%optimization?y
if?abs(h1-h2)>abs(x1-x2)
h1=x1;h2=x2;l=y;M=J;
end
y=y+w;
end
if?M<=1
fprintf('overflow!Too?large.');break
else
if?M>=N
fprintf('overflow!Too?small.');break
end
end
y=l-w;max=y+2*w;w=w/10;
end
x=(h1+h2)/2;y=l;
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。