好吧,我遇到了一个愚蠢的问题,我自己的工作和互联网搜索都没有真正提供一个解决方案,所以我想问一下,看看是否有人有任何建议。我正在写一个Matlab程序,最终是为了绘制利率曲线,这是通过使用三次b样条和优化器来获得三次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')
函数Splines写在这里:
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-knots (k + 4))/(结(k + 4 + n)节(k + 4))) *样条函数(n, k, t) +(结(k + 5 + n) - t)/(结(k + 5 + n)节(k + 5))) *样条函数(n, k + 1, t);
样条错误(第15行)花键= ((t-knots (k + 4))/(结(k + 4 + n)节(k + 4))) *样条函数(n, k, t) +(结(k + 5 + n) - t)/(结(k + 5 + n)节(k + 5))) *样条函数(n, k + 1, t);
样条错误(第15行)花键= ((t-knots (k + 4))/(结(k + 4 + n)节(k + 4))) *样条函数(n, k, t) +(结(k + 5 + n) - t)/(结(k + 5 + n)节(k + 5))) *样条函数(n, k + 1, t);
interstrateshw1错误(第88行)f0 = f0 + x(k+4,1).*Splines(3,k,t);
当我只使用&是:
使用*出错内部矩阵维数必须一致
样条错误(第15行)花键= ((t-knots (k + 4))/(结(k + 4 + n)节(k + 4))) *样条函数(n, k, t) +(结(k + 5 + n) - t)/(结(k + 5 + n)节(k + 5))) *样条函数(n, k + 1, t);
样条错误(第15行)花键= ((t-knots (k + 4))/(结(k + 4 + n)节(k + 4))) *样条函数(n, k, t) +(结(k + 5 + n) - t)/(结(k + 5 + n)节(k + 5))) *样条函数(n, k + 1, t);
interstrateshw1错误(第88行)f0 = f0 + x(k+4,1).*Splines(3,k,t);
我很抱歉问一个基本的问题,但这是非常令人沮丧的,所以任何帮助都是非常感谢的。
如果要对向量执行与运算,则必须使用单个&
而不是双&&
。a & b
将返回一个逻辑向量,每个元素i
(a(i) && b(i) == 1
)和0
(a(i) && b(i) == 0
)返回一个1
。