首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab中的指示函数--样条函数

Matlab中的指示函数--样条函数
EN

Stack Overflow用户
提问于 2013-02-27 17:27:57
回答 1查看 3.8K关注 0票数 1

好吧,我遇到了一个愚蠢的问题,我自己的工作和互联网搜索都没有真正提供解决方案,所以我想问一下,看看有没有人有什么建议。我正在写一个Matlab程序,最终目的是绘制利率曲线,这是通过使用三次B样条,然后通过优化器获得三次B样条基的系数,并使用这些信息来绘制图形来完成的。现在,我在尝试绘制图表时遇到了一个棘手的小问题。我将在下面提供错误消息和相关代码,但简而言之,正在发生的情况是:

要为给定的次数编写B-splines,您可以从指示器函数开始,然后递归地构建它们。这个指示符是关于一些输入变量的(对我来说,这就是时间,但变量实际上是什么并不是特别相关)。稍后,当我使用类似于t= (0:1:30)的范围转到与此变量相关的图形时,我得到一个错误,告诉我||和&&运算符的操作数必须可以转换为逻辑标量值。

我做了一些互联网搜索,发现&&在矢量输入时不能很好地工作(我知道我会在尝试绘制图形时传递给它),并建议使用&代替。我试过了,结果收到一个错误,说我的矩阵维度不一致,这对我来说没有意义,因为从一开始就没有任何涉及矩阵的方式。因此,在这一点上,我不确定解决这个问题的好方法是什么。在matlab中有没有一种允许绘图的矢量健壮的编程指示器函数的方法?

相关代码如下:

代码语言:javascript
复制
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的编写如下:

代码语言:javascript
复制
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

我在使用&&时收到的错误消息是:

||和&&运算符的操作数必须可转换为逻辑标量值。

如果(t>knots(k+4) && t),样条线(第9行)中出现错误

样条误差(第15行)样条= ((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);

样条误差(第15行)样条= ((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);

样条误差(第15行)样条= ((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);

InterestRatesHW1错误(第88行) f0 = f0 + x(k+4,1).*Splines(3,k,t);

当我使用just &时,我得到的错误是:

错误使用*内部矩阵尺寸必须一致。

样条误差(第15行)样条= ((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);

样条误差(第15行)样条= ((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);

InterestRatesHW1错误(第88行) f0 = f0 + x(k+4,1).*Splines(3,k,t);

很抱歉,我想问一个基本的问题,但这是一个非常令人沮丧的问题,所以我非常感谢您的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-27 17:36:05

如果要对向量执行and操作,则必须使用单个&而不是双&&a & b将返回一个带有每个元素1的逻辑向量i where a(i) && b(i) == 10 where a(i) && b(i) == 0

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15108450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档