拟合多项式的 Mathematica 无法正常工作
Mathematica Fit to Polynomial does not work correctly
我正在尝试将模拟数据拟合到多项式。幸运的是我确实知道确切的数据,而且我知道我的价值观一点也不差!
然而,当尝试使用 mathematica 将数据拟合为多项式函数时,结果根本不令人满意。
与精确数据相比的(减少的)数据:
A = {{1, 4.20109`*^7}, {1.2214`, 5.92216`*^7}, {1.49182`,
9.21732`*^7}, {1.82212`, 1.60874`*^8}, {2.22554`,
3.21498`*^8}, {2.71828`, 7.4201`*^8}, {3.32012`,
2.01259`*^9}, {4.0552`, 6.24526`*^9}, {4.95303`,
2.2347`*^10}, {6.04965`, 9.13043`*^10}, {7.38906`,
4.12888`*^11}, {9.02501`, 2.03485`*^12}, {11.0232`,
1.07487`*^13}, {13.4637`, 5.98665`*^13}, {16.4446`,
3.49113`*^14}, {20.0855`, 1.96163`*^15}, {24.5325`,
1.15952`*^16}, {29.9641`, 8.46196`*^16}, {36.5982`,
5.93001`*^17}, {44.7012`, 2.86328`*^18}, {54.5982`,
1.56988`*^19}, {66.6863`, 8.60926`*^19}, {81.4509`,
4.95028`*^20}, {99.4843`, 2.56403`*^21}, {121.51`,
1.85016`*^22}};
InterFunc = Simplify[InterpolatingPolynomial[A, x]];
poly = Fit[A, {1, x, x^2, x^3, x^4, x^5, x^6, x^7, x^9}, x]
FindFit[A,
a + b*x + c*x^2 + d*x^3 + e*x^4 + l*x^5 + m*x^6 + h*x^7 + o*x^9, {a,
b, c, d, e, l, m, h, o}, x]
func = 10966470 + 12755136*x + 9092592*x^2 + 5269920*x^3 +
2435256*x^4 + 1059120*x^5 + 257880*x^6 + 94272*x^7 + 3504*x^9;
Show[ListLogPlot[A, PlotStyle -> Red],
LogPlot[{poly}, {x, 0, First[Last[A]]}, PlotStyle -> Orange],
LogPlot[{func}, {x, 0, First[Last[A]]}, PlotStyle -> Blue]]
我的第一个想法是使用 InterpolatingPolynomial 命令并将 indata 减少到 10,这样我就得到了 9 阶多项式。它不起作用,Fit 或 FindFit 也不起作用,尽管 'func' 表明存在一个多项式很好地拟合数据。
还有另一种方法可以正确地进行拟合吗? Mathematica 使用 LeastSquare 拟合,还有其他方法可以使用吗?
另一个更数学的问题:多项式是行为良好的,为什么最小二乘在这里失败了?
详细说明我的评论,这是适合数据日志的..
fit = a + b x + c Sqrt[x ] /.
FindFit[MapAt[Log, A, {All, 2}], a + b x + c Sqrt[x ] ,
{a, b, c}, x]
Show[{LogPlot[ Exp[fit] , {x, 0, 120}], ListLogPlot[A]}]
当然,拟合不是您想要的多项式..
E^(10.686624598376872 + 6.617878262099062*Sqrt[x] - 0.2731299046868744*x)
这是使用 NormFunction
的直接多项式拟合
fn = Sum[ a[i] x^i, {i, 0, 9}];
vars = CoefficientList[fn, x];
fit = fn /. FindFit[A, fn, vars, x , NormFunction -> (Norm[Log[#]] &)]
Show[{LogPlot[ fit , {x, 0, 120}], ListLogPlot[A]}]
(* 1. + 1. x + 0.917982 x^2 + 1.76793 x^3 + 0.917982 x^4 + 1. x^5 + 4.36769 x^6 + 14.3472 x^7 + 133.75 x^8 + 3202.96 x^9 *)
这是非常偶然的,有时会根据多项式的顺序产生垃圾。
参考这里是质量较差的原始版本:
看起来不好的"error"是"only"阶10^17,相比数据高端的任何误差,基本可以忽略不计。 (圆圈点是图中的最大误差)线性拟合 space 仅有效拟合大数据值。
我正在尝试将模拟数据拟合到多项式。幸运的是我确实知道确切的数据,而且我知道我的价值观一点也不差! 然而,当尝试使用 mathematica 将数据拟合为多项式函数时,结果根本不令人满意。 与精确数据相比的(减少的)数据:
A = {{1, 4.20109`*^7}, {1.2214`, 5.92216`*^7}, {1.49182`,
9.21732`*^7}, {1.82212`, 1.60874`*^8}, {2.22554`,
3.21498`*^8}, {2.71828`, 7.4201`*^8}, {3.32012`,
2.01259`*^9}, {4.0552`, 6.24526`*^9}, {4.95303`,
2.2347`*^10}, {6.04965`, 9.13043`*^10}, {7.38906`,
4.12888`*^11}, {9.02501`, 2.03485`*^12}, {11.0232`,
1.07487`*^13}, {13.4637`, 5.98665`*^13}, {16.4446`,
3.49113`*^14}, {20.0855`, 1.96163`*^15}, {24.5325`,
1.15952`*^16}, {29.9641`, 8.46196`*^16}, {36.5982`,
5.93001`*^17}, {44.7012`, 2.86328`*^18}, {54.5982`,
1.56988`*^19}, {66.6863`, 8.60926`*^19}, {81.4509`,
4.95028`*^20}, {99.4843`, 2.56403`*^21}, {121.51`,
1.85016`*^22}};
InterFunc = Simplify[InterpolatingPolynomial[A, x]];
poly = Fit[A, {1, x, x^2, x^3, x^4, x^5, x^6, x^7, x^9}, x]
FindFit[A,
a + b*x + c*x^2 + d*x^3 + e*x^4 + l*x^5 + m*x^6 + h*x^7 + o*x^9, {a,
b, c, d, e, l, m, h, o}, x]
func = 10966470 + 12755136*x + 9092592*x^2 + 5269920*x^3 +
2435256*x^4 + 1059120*x^5 + 257880*x^6 + 94272*x^7 + 3504*x^9;
Show[ListLogPlot[A, PlotStyle -> Red],
LogPlot[{poly}, {x, 0, First[Last[A]]}, PlotStyle -> Orange],
LogPlot[{func}, {x, 0, First[Last[A]]}, PlotStyle -> Blue]]
我的第一个想法是使用 InterpolatingPolynomial 命令并将 indata 减少到 10,这样我就得到了 9 阶多项式。它不起作用,Fit 或 FindFit 也不起作用,尽管 'func' 表明存在一个多项式很好地拟合数据。 还有另一种方法可以正确地进行拟合吗? Mathematica 使用 LeastSquare 拟合,还有其他方法可以使用吗?
另一个更数学的问题:多项式是行为良好的,为什么最小二乘在这里失败了?
详细说明我的评论,这是适合数据日志的..
fit = a + b x + c Sqrt[x ] /.
FindFit[MapAt[Log, A, {All, 2}], a + b x + c Sqrt[x ] ,
{a, b, c}, x]
Show[{LogPlot[ Exp[fit] , {x, 0, 120}], ListLogPlot[A]}]
当然,拟合不是您想要的多项式..
E^(10.686624598376872 + 6.617878262099062*Sqrt[x] - 0.2731299046868744*x)
这是使用 NormFunction
fn = Sum[ a[i] x^i, {i, 0, 9}];
vars = CoefficientList[fn, x];
fit = fn /. FindFit[A, fn, vars, x , NormFunction -> (Norm[Log[#]] &)]
Show[{LogPlot[ fit , {x, 0, 120}], ListLogPlot[A]}]
(* 1. + 1. x + 0.917982 x^2 + 1.76793 x^3 + 0.917982 x^4 + 1. x^5 + 4.36769 x^6 + 14.3472 x^7 + 133.75 x^8 + 3202.96 x^9 *)
这是非常偶然的,有时会根据多项式的顺序产生垃圾。
参考这里是质量较差的原始版本:
看起来不好的"error"是"only"阶10^17,相比数据高端的任何误差,基本可以忽略不计。 (圆圈点是图中的最大误差)线性拟合 space 仅有效拟合大数据值。