麻烦看一下这个matlab写的程序错在哪里

学习 时间:2026-04-08 02:06:02 阅读:9635
麻烦看一下这个matlab写的程序错在哪里除了A及其波动率σA,其他量均为已知.因为该方程组为非线性方程,在matlab中采用迭代的方法进行求解A及其波动率σA.function[x,y]=Solvequation(a,DB,sigma,r,tau)%%%%%%%isigma C>=DBa=C;elsea=DB;endy=a/2;w=a/10;eye=a/1000;N=50;h1=0;h2=1e+5;max=w*N+y;while w>=eyeJ=0;whilemax>=yJ=J+1;%equation 1x1=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 2x2=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 yisigma abs(h1-h2)>abs(x1-x2)h1=x1;h2=x2;l=y;M=J;endy=y+w;endisigma M<=1sigmaprintsigma('oversigmalow!Too large.');breakelseisigma M>=Nsigmaprintsigma('oversigmalow!Too small.');breakendendy=l-w;max=y+2*w;w=w/10;endx=(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两种情况

最佳回答

高大的御姐

贤惠的灯泡

2026-04-08 02:06:02

问题分析 你的这段程序问题太多了,条件说的也不够清楚,所以,分析很大程度上靠猜测: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。2880y =  3。7690e+010(2)第二组数据x =    0。2000y =  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;endy=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;endx=(h1+h2)/2;y=l;

最新回答共有2条回答

  • 淡然的睫毛膏
    回复
    2026-04-08 02:06:02

    问题分析 你的这段程序问题太多了,条件说的也不够清楚,所以,分析很大程度上靠猜测: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。2880y =  3。7690e+010(2)第二组数据x =    0。2000y =  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;endy=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;endx=(h1+h2)/2;y=l;

上一篇 audio的汉语意思是什么?

下一篇 It was a matter of----would take the position