麻烦看一下这个matlab写的程序错在哪里除了A及其波动率σA,其他量均为已知.因为该方程组为非线性方程,在matlab中采用迭代的方法进行求解A及其波动率σA.function[x,y]=Solvequation(a,DB,sigma,r,tau)%%%%%
来源:学生作业帮助网 编辑:作业帮 时间:2024/06/27 13:03:12
![麻烦看一下这个matlab写的程序错在哪里除了A及其波动率σA,其他量均为已知.因为该方程组为非线性方程,在matlab中采用迭代的方法进行求解A及其波动率σA.function[x,y]=Solvequation(a,DB,sigma,r,tau)%%%%%](/uploads/image/z/2105205-69-5.jpg?t=%E9%BA%BB%E7%83%A6%E7%9C%8B%E4%B8%80%E4%B8%8B%E8%BF%99%E4%B8%AAmatlab%E5%86%99%E7%9A%84%E7%A8%8B%E5%BA%8F%E9%94%99%E5%9C%A8%E5%93%AA%E9%87%8C%E9%99%A4%E4%BA%86A%E5%8F%8A%E5%85%B6%E6%B3%A2%E5%8A%A8%E7%8E%87%CF%83A%2C%E5%85%B6%E4%BB%96%E9%87%8F%E5%9D%87%E4%B8%BA%E5%B7%B2%E7%9F%A5.%E5%9B%A0%E4%B8%BA%E8%AF%A5%E6%96%B9%E7%A8%8B%E7%BB%84%E4%B8%BA%E9%9D%9E%E7%BA%BF%E6%80%A7%E6%96%B9%E7%A8%8B%2C%E5%9C%A8matlab%E4%B8%AD%E9%87%87%E7%94%A8%E8%BF%AD%E4%BB%A3%E7%9A%84%E6%96%B9%E6%B3%95%E8%BF%9B%E8%A1%8C%E6%B1%82%E8%A7%A3A%E5%8F%8A%E5%85%B6%E6%B3%A2%E5%8A%A8%E7%8E%87%CF%83A.function%5Bx%2Cy%5D%3DSolvequation%28a%2CDB%2Csigma%2Cr%2Ctau%29%25%25%25%25%25)
麻烦看一下这个matlab写的程序错在哪里除了A及其波动率σA,其他量均为已知.因为该方程组为非线性方程,在matlab中采用迭代的方法进行求解A及其波动率σA.function[x,y]=Solvequation(a,DB,sigma,r,tau)%%%%%
麻烦看一下这个matlab写的程序错在哪里
除了A及其波动率σA,其他量均为已知.因为该方程组为非线性方程,在matlab中采用迭代的方法进行求解A及其波动率σA.
function[x,y]=Solvequation(a,DB,sigma,r,tau)
%%%%%%%
isigma 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;
whilemax>=y
J=J+1;
%equation 1
x1=sigmasolve(@(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','osigmasigma'));
%equation 2
x2=sigmasolve(@(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','osigmasigma'));
%optimization y
isigma abs(h1-h2)>abs(x1-x2)
h1=x1;h2=x2;l=y;M=J;
end
y=y+w;
end
isigma M<=1
sigmaprintsigma('oversigmalow!Too large.');break
else
isigma M>=N
sigmaprintsigma('oversigmalow!Too small.');break
end
end
y=l-w;max=y+2*w;w=w/10;
end
x=(h1+h2)/2;y=l;
将σE 、E、τ(/tau/)、r、B的值带入经迭代得出
(1)σE=1.03402127,E=6852804951,r=3.25%,τ=1,B=195162000
(2)σE =0.43666672,E=2503241663,r=3.25%,τ=1,B=3155000000
两种情况
麻烦看一下这个matlab写的程序错在哪里除了A及其波动率σA,其他量均为已知.因为该方程组为非线性方程,在matlab中采用迭代的方法进行求解A及其波动率σA.function[x,y]=Solvequation(a,DB,sigma,r,tau)%%%%%
问题分析
你的这段程序问题太多了,条件说的也不够清楚,所以,分析很大程度上靠猜测:
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 zd918361556824217139
sigma=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;