【问题标题】:octave runs ok but plot is not displayed?八度运行正常,但绘图不显示?
【发布时间】:2011-05-13 22:25:18
【问题描述】:

你好 我正在使用带有绘图命令的 Octave 2.3.4。我是 Octave 的新手。由于某种原因,该图不显示。这是我的 M 文件示例:

        1;

clear all;

%%%%%%%%% parameters setting  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
r=0.01; %risk free rate
S0=50; %underlying price 1

%create an implied volatiltiy surface using below parameters:
basevol=0.25; %implied volatility at time t=0 and in center of strike axis
skewT=-0.001; %icrease in vol for one unit increase in maturity
v1=0.1; %defines how much a smile is raised at left end from base vol
v3=0.2; %defines how much a smile is raised at right end from base vol

nK=100; %no. of strike steps
nT=10; %no. of time steps
Tmax=1; %maximum value in time axis
Kmin=1; %minimum value in strike price axis 
Kmax=150; %maximum value of strike price axis
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 


dt=Tmax/(nT-1);
Tvec=0:dt:1;
dk=(Kmax-Kmin)/(nK-1);
Kvec=Kmin:dk:Kmax;
Tvec=Tvec';
Kvec=Kvec';
nK=size(Kvec,1);
nT=size(Tvec,1);
dvolT=ones(nK,nT)*(skewT*dt);
dvolT=cumsum(dvolT,2);

SmileVec=GetSmile(Kvec,v1,0,v3);
dvolK=ones(nK,nT);
dvolK=repmat(SmileVec,1,nT);

ImpliedVolSurface=ones(nK,nT)*basevol+dvolT+dvolK;

%use formula mentioned by John Elder in "Hedging for Financial Derivatives"
%this formula gives local volatility using implied volatility 
function ret=GetLocalVolSurface(ImpliedVolSurface, S, r, Kvec, Tvec)
  [m,n]=size(ImpliedVolSurface);
  LocalVolSurface=zeros(m,n);
  dk=Kvec(2)-Kvec(1);
  dt=Tvec(2)-Tvec(1);
  x=ImpliedVolSurface;
  for i=3:m-2, %loop over strikes
    for j=1:n-1, %loop over time steps
      dv_dk=(x(i+1,j)-x(i-1,j))/(2*dk);
      dv2_dk2=(x(i-1,j)-2*x(i,j)+x(i+1,j))/(dk*dk);
      dv_dt=(x(i,j+1)-x(i,j))/dt;
      K=Kvec(i);
      T=Tvec(j+1);
      rT=T^0.5;
      sig=x(i,j);
      h1=(log(S/K)+r*T+0.5*sig*sig*T)/(sig*rT);
      numer=sig*sig + 2*T*sig*dv_dt + 2*r*K*T*sig*dv_dk;
      denom=(1+K*h1*rT*dv_dk)^2 + K*K*T*sig*sig*(dv2_dk2-h1*dv_dk*dv_dk*rT);
      LocalVolSurface(i,j)=(numer/denom)^0.5;
    end
  end
  ret=LocalVolSurface;
endfunction


LocalVol_Surface=GetLocalVolSurface(ImpliedVolSurface,S0,r,Kvec,Tvec);

AsyImplVols=zeros(nK,1);
T=Tvec(nT-1);
F=S0*exp(r*T);

for i=3:nK-2,
    % use formula sigBS(F,K)=sigLoc( (F+K)/2 )
    K=Kvec(i);
    lookupK=(F+K)/2;
    kdiff=abs(Kvec-lookupK); %try to find nearest point in grid
    kidx=min(find(kdiff==min(kdiff)));
    if ( (kidx > 3) && (kidx < nK-2) ),
        AsyImplVols(i)=LocalVol_Surface(kidx);
    else
        AsyImplVols(i) = NaN;
    end
end
figure(1);
plot(Kvec(3:nK-2),[ImpliedVolSurface(3:nK-2,nT-1) LocalVol_Surface(3:nK-2,nT-1) AsyImplVols(3:nK-2)]);

当我在 Octave 中运行且没有错误时,该图永远不会显示。它确实包括我理解的 gnuplot 1.0.1 图表吗?有什么我没有做或缺少的吗?我也在 Windows 2003 Server 上运行它。 谢谢

【问题讨论】:

  • GetSmile() 应该做什么?

标签: octave


【解决方案1】:

我得到了答案here。 Octave 默认使用 fltk 进行绘图等,但无法正常工作,在这里使用 gnuplot 有效。只需将以下行添加到主目录中的 .octaverc 文件中。

graphics_toolkit("gnuplot")

这样每次八度开始时它都会将默认的绘图包设置为gnuplot

【讨论】:

  • 就我而言,在使用 Fedora 时,我得到的是黑屏而不是绘图。我的 .octaverc 不存在。但这就像一个魅力。
【解决方案2】:

我确实知道这是一个老问题,但由于我昨天遇到了完全相同的错误,也许这也可以帮助其他人:

根据Octave wiki pages,绘图和“oct2mat”库似乎存在问题。对我来说,在 octave 命令提示符下运行后,问题就解决了:

pkg rebuild -noauto oct2mat

并重新启动八度。当需要使用“oct2mat”时,输入:

pkg load oct2mat

希望有帮助!

【讨论】:

    【解决方案3】:

    我在装有英特尔显卡的 Windows 7 64 位笔记本电脑 (HP 630) 上安装时遇到了同样的问题。每次你绘图时,它都没有做任何事情,但如果你再次绘图,它就会出现。这是某种刷新错误。这很烦人,但如果你绘制两次,第二次就可以了。

    我想知道这是否是某种双缓冲错误,因为它在我自己的笔记本电脑上正常工作,运行 Windows 7 和专用显卡。

    无论如何,尝试连续绘制两次,我敢打赌它会起作用,请告诉我机器和显卡是什么,因为我已经向八度开发报告了这个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-22
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      相关资源
      最近更新 更多