【问题标题】:Curve fitting equations involving integrals in MATLABMATLAB中涉及积分的曲线拟合方程
【发布时间】:2014-06-21 07:55:15
【问题描述】:

我有一个方程式,我试图拟合一些实验数据。过去我使用lsqcurvefit 并传入实验数据,以及描述我拟合数据的函数。例如

model = @(p,x) exp(-p(1).*x);
startingVals = 0.5;
lsqcurvefit(model,startingVals,expData_x,exptData_y)

这将与 MATLAB 返回最接近我的数据的 p 值完美配合。在内部,我猜它正在调整 p 的值,这是一种最小化差异平方和的聪明方法。

现在我有一个非分析模型,想找到最接近的拟合 B。一个例子是:

model = integral(@(v)besselj(0,x.*v.*B), 0, 40);

(只是一个例子,也许它可以解析解决,但我的绝对不能)。

所以为了计算模型,我放入了B 的试用版,它会计算每个x 的函数。到目前为止,我一直在为一系列试用B 术语计算模型,例如B = 1:1:10。这会给我 10 个向量,每个向量都有一组不同的模型点。然后我会运行脚本,从每个模型计算中找到最小的残差减去实验数据。

这似乎工作正常,但现在我正在处理一个包含多个拟合项的方程。比如

model = integral(@(v)(C.*D).*besselj(0,x.*v.*B).^(E), 0, 40);

我现在可能想找到B, C, D and E 的最佳拟合值。我的方法仍然有效,但会产生大量的实验试验,例如循环遍历每个值的 10 个值将生成 10,000 条单独的曲线。

我的方法很好还是我错过了一种更简单的方法来适应这些功能?

谢谢

编辑:感谢大卫的工作代码。

请注意,有时lsqcurvefit 会返回复数,但这是另一个问题。显然,真实数据不会完美匹配,但我不知道您可以将此类函数传递给 lsqcurvefit。

A = 0.2; %input variables to 'solve' for later
B = 0.3;
C = 0.4;
D = 0.5;
x = logspace(-2,2,200); %x data

options = optimset('MaxFunEvals', 200,'MaxIter', 200,'TolFun',1e-10,'Display','off');

genData = arrayfun(@(x) integral(@(v) A.*B.*besselj(0,x.*v.*C).^D, 0, 40),x); %generate some data
genData = real(genData); 

model = @(p,x) real(arrayfun(@(x) integral(@(v) p(1).*p(2).*besselj(0,x.*v.*p(3)).^p(4), 0, 40),x)); 

startingVals = [0.5 0.5 0.5 0.5]; %guess values
lb = [0.1 0.1 0.1 0.1]; %lower bound
ub = [1 1 1 1]; %upper bound

[p] = lsqcurvefit(model,startingVals,x,genData,lb,ub,options); %do the fit, takes a while

fitData = real(arrayfun(@(x) integral(@(v) p(1).*p(2).*besselj(0,x.*v.*p(3)).^p(4), 0, 40),x)); %regenrate data based on fitted values

semilogx(x,genData,'ro')
hold on
semilogx(x,fitData,'b')

【问题讨论】:

    标签: matlab integration curve-fitting


    【解决方案1】:

    这应该让lsqcurvefit 能够在model 上工作:

    model=@(p,x) arrayfun(@(x) integral(@(v) p(1).*p(2).*besselj(0,x.*v.*p(3)).^p(4), 0, 40),x);
    

    但是我编了一些系数BCDE,性能不是很好。我不确定是因为我选择了错误的数字还是这是一种缓慢的方法。

    【讨论】:

    • 太棒了!谢谢,我不知道您可以使用数组乐趣来做到这一点。真的需要学会驾驭arrayfun的力量。我用一个完整的代码示例编辑了我的问题,可以运行它以显示它的工作原理,是的,它确实需要一段时间,但我希望它具有如此复杂的功能。如果问题允许,可以使用适当的下限和上限来真正缩短时间。
    猜你喜欢
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 2014-05-28
    • 2015-03-02
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多