1

さて、私はばかげた問題に遭遇しました、そして私自身の仕事とインターネット検索の両方は本当に解決策を提供しませんでした、それで私は誰かが何か提案があるかどうか尋ねて見たかったです。私は最終的に金利曲線を描くことを目的としたMatlabプログラムを作成しています。これは、3次Bスプラインを使用し、次にオプティマイザーを使用して3次Bスプラインベースの係数を取得し、この情報を使用してグラフ化することで実行されます。グラフをプロットしようとすると、トリッキーな小さな問題が発生しました。以下にエラーメッセージと関連するコードを示しますが、つまり、何が起こっているのかは次のとおりです。

特定の次数のBスプラインをプログラムするには、インジケーター関数から始めて、再帰的に作成します。このインジケーターは、いくつかの入力変数に関するものです(私にとってはその時ですが、変数が実際に何であるかは特に関係ありません)。後でこの変数に関してt=(0:1:30)のような範囲を使用してグラフに移動すると、オペランドが||であるというエラーが表示されます。&&演算子は、論理スカラー値に変換可能である必要があります。

私はインターネット検索を行ったところ、&&はベクトル入力ではうまく機能しないことがわかり(グラフ化を試みているときにこれを渡すことになると理解しています)、代わりに&を使用することを提案しました。私はそれを試しましたが、代わりに、一致しない行列の次元があるというエラーを受け取りました。これは、そもそも行列が関係する方法がないため、私には意味がありませんでした。したがって、現時点では、この問題を解決するための良い方法が何であるかはわかりません。プロットを可能にするMATLABのインジケーター関数をプログラミングするベクトルの堅牢な方法はありますか?

関連するコードは次のとおりです。

startvec = 0.007*ones(16,2);

%[x,fval] = fminsearch(@(x) FittingFunction(x, Rhat, today, startdays, enddays, fixedcoupondays, floatingcoupondays),startvec,optimset('Display','iter','MaxIter',50,'MaxFunEvals',50));

f0 = 0;
l0 = 0;
t = (0:1:30);

x = startvec;

for k=-3:1:12
    f0 = f0 + x(k+4,1).*Splines(3,k,t);
    l0 = l0 + x(k+4,2).*Splines(3,k,t);
end

h1 = figure('Name','OIS Curve','NumberTitle','off')
plot(t,f0);
title('OIS Curve as a Function of Time');
xlabel('time (years)');
ylabel('OIS Rate');
%hold off
print(h1,'-dpdf','OISCurve.pdf')

h2 = figure('Name','LIBOR Curve','NumberTitle','off')
plot(t,l0);
title('LIBOR Curve as a Function of Time');
xlabel('time (years)');
ylabel('LIBOR Rate');
%hold off
print(h2,'-dpdf','LIBORCurve.pdf')

関数スプラインはここに書かれています:

function spline = Splines(n,k,t)

% The following code builds a B-spline function of any degree, using the
% recursive properties of B-splines.  Can be defined from k=-3 to k=12.

knots = [-1/4 -1/6 -1/12 0 1/12 1/4 1/2 3/4 1 3/2 2 4 7 11 21 31 41 51 61 71 81 91 101 111];

if (n==0)
    if (t>knots(k+4) && t<knots(k+5))
        spline = 1;
    else
        spline = 0;
    end
else
    spline = ((t-knots(k+4))/(knots(k+4+n)-knots(k+4)))*Splines(n-1,k,t) + ((knots(k+5+n)-t)/(knots(k+5+n)-knots(k+5)))*Splines(n-1,k+1,t);
end

&&を使用しているときに受け取ったエラーメッセージは次のとおりです。

||へのオペランド &&演算子は、論理スカラー値に変換可能である必要があります。

スプラインのエラー(9行目)if(t> knots(k + 4)&& t

スプラインのエラー(15行目)スプライン=((t-ノット(k + 4))/(ノット(k + 4 + n)-ノット(k + 4)))*スプライン(n-1、k、t) +((knots(k + 5 + n)-t)/(knots(k + 5 + n)-knots(k + 5)))*スプライン(n-1、k + 1、t);

スプラインのエラー(15行目)スプライン=((t-ノット(k + 4))/(ノット(k + 4 + n)-ノット(k + 4)))*スプライン(n-1、k、t) +((knots(k + 5 + n)-t)/(knots(k + 5 + n)-knots(k + 5)))*スプライン(n-1、k + 1、t);

スプラインのエラー(15行目)スプライン=((t-ノット(k + 4))/(ノット(k + 4 + n)-ノット(k + 4)))*スプライン(n-1、k、t) +((knots(k + 5 + n)-t)/(knots(k + 5 + n)-knots(k + 5)))*スプライン(n-1、k + 1、t);

InterestRatesHW1のエラー(88行目)f0 = f0 + x(k + 4,1)。*スプライン(3、k、t);

&だけを使用したときに発生するエラーは次のとおりです。

使用エラー*内部行列の次元は一致する必要があります。

スプラインのエラー(15行目)スプライン=((t-ノット(k + 4))/(ノット(k + 4 + n)-ノット(k + 4)))*スプライン(n-1、k、t) +((knots(k + 5 + n)-t)/(knots(k + 5 + n)-knots(k + 5)))*スプライン(n-1、k + 1、t);

スプラインのエラー(15行目)スプライン=((t-ノット(k + 4))/(ノット(k + 4 + n)-ノット(k + 4)))*スプライン(n-1、k、t) +((knots(k + 5 + n)-t)/(knots(k + 5 + n)-knots(k + 5)))*スプライン(n-1、k + 1、t);

InterestRatesHW1のエラー(88行目)f0 = f0 + x(k + 4,1)。*スプライン(3、k、t);

基本的な質問とは何でしょうか。申し訳ありませんが、これは非常に苛立たしいことですので、どんな助けでも大歓迎です。

4

1 に答える 1

1

ベクトルに対してand-operationを実行する場合&は、doubleではなくsingleを使用する必要があります。各要素の論理ベクトルを返します。whereおよびwhere 。&&a & b1ia(i) && b(i) == 10a(i) && b(i) == 0

于 2013-02-27T09:36:05.060 に答える