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
答案 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)