matlab - MATLAB 中涉及积分的曲线拟合方程

标签 matlab integration curve-fitting

我有一个方程,正在尝试拟合一些实验数据。过去我使用过 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 和E 的最佳拟合值。我的方法仍然有效,但会生成大量的实验,例如循环遍历每个值的 10 个值将生成 10,000 条单独的曲线。

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

谢谢

编辑:感谢 David,工作代码。

请注意,有时 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')

最佳答案

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

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

但是我编写了一些系数BCDE,性能不是很好好的。我不确定是否是因为我选择了错误的数字,或者是否是一个缓慢的方法。

关于matlab - MATLAB 中涉及积分的曲线拟合方程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23465276/

相关文章:

c++ - 分段拟合 ROOT Cern,范围不受尊重

matlab - 如何在matlab中按顺序重命名值?

matlab - 我可以使用神经网络在仅知道输入的情况下获得输出序列的估计吗?

Matlab - implay 的默认大小窗口

node.js - 将 Angular2 应用程序导入 Phoenix 框架

python - 使用 Python 将指数修正高斯曲线拟合到数据

arrays - 如何使用冒号运算符将半整数序列压缩为字符串表达式? (如何将列表转换为字符串)

integration - Redmine 和 JIRA 集成

java - 如何集成不同编程语言编写的程序?

python - 为什么 scipy.optimize.curve_fit 产生的参数与猜测几乎没有什么不同?