楼主: forex95
4474 3

[问答] 如何让矩阵的输出精度达到小树点后面8位呢 [推广有奖]

  • 2关注
  • 32粉丝

副教授

17%

还不是VIP/贵宾

-

威望
0
论坛币
5913 个
通用积分
8.7300
学术水平
18 点
热心指数
23 点
信用等级
14 点
经验
14239 点
帖子
418
精华
0
在线时间
775 小时
注册时间
2010-3-6
最后登录
2023-12-23

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
下面是我的代码,可是矩阵的值比较大,输出的时候。是这样的
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
请各位高手指点?将不胜感激。

二维码

扫码加我 拉你入群

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

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

关键词:function assert Sigma zeros break 矩阵 计算 function 如何

情绪只是时间的消耗品,所谓非理性行为就是对时间的量化。
沙发
forex95 发表于 2012-2-26 23:19:55 |只看作者 |坛友微信交流群
怎么没有人回复我啊?
情绪只是时间的消耗品,所谓非理性行为就是对时间的量化。

使用道具

藤椅
forex95 发表于 2012-2-27 09:45:55 |只看作者 |坛友微信交流群
情绪只是时间的消耗品,所谓非理性行为就是对时间的量化。

使用道具

板凳
matlab-007 发表于 2016-8-23 05:58:50 |只看作者 |坛友微信交流群
format long  
就可以了,就改成长精度了

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-1 17:30