全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 MATLAB等数学软件专版
4747 3
2012-02-26
下面是我的代码,可是矩阵的值比较大,输出的时候。是这样的
1.0e+009 *
       NaN
    1.5026
    1.1131
       NaN
    0.0015
    0.0025
    0.0005
    0.0399
可是我想要精确一些。
如何让矩阵的输出精度达到小树点后面8位呢?

另外还有个问题,我的函数明明输出的是两个值,为什么最后只输出一个
va,另外sigmava却没有结果出来呢。请各位高手指点?

以下是我的代码。
function[Va,SigmaVa]=CalV(E,SigmaE,D,r,T)
%a=zeros(8,8);
D=[
    1096853709
    1422513664
    1080412570
    1099330560
    821720
    676976
    196840
    37877619
    ];
a=D;
%b=zeros(8,8);
E=[
    5482334
    112522064
    57679892
    4537800
    751520
    1882103.375
    285241.125
    3833159
    ];
b=E;
%c=zeros(8,8);
SigmaE=[
    0.401835787
    0.543863954
    0.609681884
    0.741317746
    0.917986928
    0.931843334
    1.004589468
    1.02883818
    ];
c=SigmaE;
%计算Va'SigmaVa
key=0;
r=0.0225;
T=1;
PI=4*atan(1);
Va=b;%va以E为迭代的初值
newVa=Va;
SigmaVa=c; %SigmaVa以SigmaE为迭代的初值
for k=1:10  %迭代SigmaVa
    for j=1:10 %迭代Va
        oldVa=newVa;
        % Va=(E+D*exp(-r,T)*Nd2)/Ndl;
        % SigmaVa=E*SigmaE/(E+D*exp(-r,T)*Nd2);
        %t1=log(oldVa/a);
        d1=(log(oldVa./a)+(r+(SigmaVa.^2)/2)*T)./(SigmaVa.*(T^(1/2)));
        d2=d1-(SigmaVa*(T^(1/2)));
        Nd1=normcdf(d1,0,1);
        Nd2=normcdf(d2,0,1);
        fV=oldVa.*Nd1-a.*exp(-r*T).*Nd2-b;
        temp111=exp(-d1.^2/2)./((2*PI*T)^0.5.*SigmaVa)
        dfV=Nd1+temp111-a.*exp(-r*T).*exp(-d2.^2/2)./((2*PI*T)^0.5.*oldVa.*SigmaVa);
        if dfV==0
            dfV
            pause;
        end
        dV=-fV./dfV;
        newVa=oldVa+dV;   %前后两次的值认为非常接近,则迭代成功
        newVa
        if newVa==0
            oldVa
            newVa
            pause;
        end
        if(dV/newVa)<1e-7 & (dV/newVa)>-1e-7
            break;
        end
    end
    Va=newVa;
    d1=(log(Va./a)+(r+(SigmaVa.^2)/2)*T)./(SigmaVa.*(T^(1/2)));
    d2=d1-(SigmaVa*(T^(1/2)));
    Nd1=normcdf(d1,0,1);
    Nd2=normcdf(d2,0,1);  %方程右边与左边的比值
    diff=(Va.*Nd1-a.*exp(-r*T).*Nd2)./b;
    if diff<1-1e-5 | diff>1+1e-5
        assert('迭代出现错误'); %迭代出现错误
    else
        key=key+1;
    end
    newSigmaVa=b.*c./(b+a.*exp(-r*T).*Nd2);
    if((SigmaVa-newSigmaVa)./newSigmaVa)<1e-5 & ((SigmaVa-newSigmaVa)./newSigmaVa)>(-1e-5)
        break;
        key=key+1;
    else
        SigmaVa=newSigmaVa;
    end
end
if key==2
    %else
    % Va=一l:
    % SigmaVa=-1:
end
请各位高手指点?将不胜感激。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2012-2-26 23:19:55
怎么没有人回复我啊?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-2-27 09:45:55
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-8-23 05:58:50
format long  
就可以了,就改成长精度了
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群