使用matlab fit对象作为函数

时间:2016-03-19 11:33:07

标签: matlab curve-fitting data-fitting

Matlab拟合无疑是有用的,但目前尚不清楚如何将其用作函数 除了在官方网站上给出的微不足道的整合和差异化: http://uk.mathworks.com/help/curvefit/example-differentiating-and-integrating-a-fit.html

例如,给定存储在对象'曲线中的拟合。一个人可以评估 曲线(x)得到一个数字。但是人们会怎样,例如整合|曲线(x)| ^ 2(除了笨拙地创造一个新的契合)?天真地尝试

 curve = fit(x_vals,y_vals,'smoothingspline');
 integral(curve(x)*curve(x), 0, 1)

给出错误:

 Output of the function must be the same size as the input. If FUN is an array-valued integrand, set the 'ArrayValued' option to true.

我还尝试通过定义一个正常函数和一个用于被积函数的隐函数(下面),但两者都给出了同样的错误。

 func=@(x)(curve(x))...; % trial solution 1
 function func_val=func(curve, x)...; % trial solution 2

2 个答案:

答案 0 :(得分:0)

为被积函数定义函数,然后与选项'ArrayValued'集成设置为'true'有效:

 func=@(x)(curve(x)*curve(x));
 integral(func,0,1,'ArrayValued',true)

答案 1 :(得分:0)

您需要对函数进行矢量化,即使用curve(x).*curve(x)curve(x).^2等元素操作。

还要确保输出的形状与输入匹配,即行输出给出行输出,类似于列作为列。似乎评估fit对象总是返回一个列向量(例如f(1:10)返回10x1向量而不是1x10)。

话虽如此,这是一个例子:

x = linspace(0,4*pi,100)';
y = sin(x);
y = y + 0.5*y.*randn(size(y));
f = fit(x, y, 'smoothingspline');

现在你可以整合为:

integral(@(x) reshape(f(x).^2,size(x)), 0, 1)

在这种情况下,它可以简化为简单的转置:

integral(@(x) (f(x).^2)', 0, 1)