总和数学函数

我试图曲线拟合高斯分布给函数的任意一笔 - 每个都有自己的参数集。 目前,如果我想使用的22功能,我这样做

φ[α_?NumberQ, x_?NumberQ, xi_?NumberQ, c_?NumberQ] := ( c E^(- α (x - xi)^2/2))/Sqrt[α/π]; Data := Table[{n/50, N[f[n/50]]}, {n, -300, 300}]; model = φ[a1, x, x1, c1] + φ[a2, x, x2, c2] + φ[a3, x, x3, c3] + φ[a4, x, x4, c4] + φ[a5, x, x5, c5] + φ[a6, x, x6, c6] + φ[a7, x, x7, c7] + φ[a8, x, x8, c8] + φ[a9, x, x9, c9] + φ[a10, x, x10, c10] + φ[a11, x, x11, c11] + φ[a12, x, x12, c12] + φ[a13, x, x13, c13] + φ[a14, x, x14, c14] + φ[a15, x, x15, c15] + φ[a16, x, x16, c16] + φ[a17, x, x17, c17] + φ[a18, x, x18, c18] + φ[a19, x, x19, c19] + φ[a20, x, x20, c20]; nlm = NonlinearModelFit[Data, model, {a1, x1, c1, a2, x2, c2, a3, x3, c3, a4, x4, c4, a5, x5, c5, a6, x6, c6, a7, x7, c7, a8, x8, c8, a9, x9, c9, a10, x10, c10, a11, x11, c11, a12, x12, c12, a13, x13, c13, a14, x14, c14, a15, x15, c15, a16, x16, c16, a17, x17, c17, a18, x18, c18, a19, x19, c19, a20, x20, c20}, x];

这种运作良好,但它是乏味的手动创建这些线性组合。 这将是美妙的创建函数的线性组合为一,十一,和c系数向量。 我只是不确定如何处理这一点,我希望你们能提供一些洞察到这一点。

最好的,

托马斯

--------------解决方案-------------

我做了,就像这之前:

params = Flatten[
Table[{Subscript[a, i], Subscript[m, i], Subscript[c, i]}, {i, 1,
n}]];
model = Sum[
Phi[Subscript[a, i], x, Subscript[m, i], Subscript[c, i]], {i, 1,
n}];
fit = NonlinearModelFit[data, model, params, x]];

只需要用你需要然而,许多高斯ñ。 显然,如果你有不同的基础功能,你必须做其他的事情,但这个工作得很好,当你的工作只是一组(甚至两个)的基础功能。

这里是概念代码一些证据:

Phi[x_, a_, b_, c_] := c Exp[-(x - a)^2/b^2]/(b Sqrt[\[Pi]])

n = 10;
Ap = RandomReal[{-5, +5}, {n}];
Bp = RandomReal[{0.2, 2}, {n}];
Cp = RandomReal[{-3, +3}, {n}];
f[x_] := Evaluate[Sum[Phi[x, Ap[[i]], Bp[[i]], Cp[[i]]], {i, n}]]

data = Module[{x, y},
x = RandomReal[{-10, +10}, {3000}];
y = f[x];
Transpose[{x, y}]];
(* Force data to be precision to be 50 digits, so we can use higher precision in NLMF *)
data = N[Round[data * 10^50] / 10^50, 50];

params = Flatten@Table[{a@i, b@i, c@i}, {i, n}];
model = Sum[Phi[x, a@i, b@i, c@i], {i, n}];
fit = Normal@NonlinearModelFit[data, model, params, x, WorkingPrecision->50];

Show[ListPlot[data, PlotStyle -> Red], Plot[fit, {x, -5, +5}],
PlotRange -> All]

你可以试试:

Phi[α_, x_, xi_, c_] := (c E^(- α (x - xi)^2/2))/Sqrt[α/π];

model = Sum[Phi[a@i, x, xx@i, c@i], {i, 20}];

nlm = NonlinearModelFit[Data, model, Flatten@Table[{a@i, xx@i, c@i}, {i, 20}], x]

编辑

没测试过,但我想离开高斯数indeternate你也可以这样做:

nlm[n_] := NonlinearModelFit[Data, Sum[Phi[a@i, x, xx@i, c@i], {i, n}]
Flatten@Table[{a@i, xx@i, c@i}, {i, n}], x];

nlm[20]

分类:数学钨 时间:2015-03-14 人气:0
本文关键词: 数学钨
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.518 (s). 10 q(s)