Mathematica Fit to Polynomial работает некорректно

Я пытаюсь сопоставить данные моделирования с полиномом. К счастью, я знаю точные данные и знаю, что мои значения совсем не плохи! Однако при попытке подогнать данные к полиномиальной функции с помощью 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 и уменьшить количество данных до 10, чтобы я получил полином 9-го порядка. Он не работает, ни Fit, ни FindFit, хотя «func» показывает, что существует полином, хорошо соответствующий данным. Есть ли другой способ сделать подгонку правильно? Mathematica использует метод наименьших квадратов, есть ли другой метод, который можно использовать?

Еще один более математический вопрос: полином ведет себя хорошо, почему здесь не работает метод наименьшего квадрата?


person Botulus    schedule 30.03.2015    source источник
comment
Проблема в том, что FindFit вычисляет свою ошибку в линейном пространстве. Если вам просто нужна хорошая подгонка, вы должны взять журнал данных и подстроиться под нее. Если вы действительно хотите эту полинольную форму, вам нужно будет работать с аргументом NormFunction для FindFit, чтобы указать ему определить ошибку на основе журнала данных.   -  person agentp    schedule 30.03.2015


Ответы (1)


развивая мой комментарий, вот соответствие журналу данных.

 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 *)

Это очень удачный или промах, иногда давая мусор в зависимости от порядка полинома.

введите здесь описание изображения

Для справки вот оригинал низкого качества:

введите здесь описание изображения

«Ошибка», где это выглядит плохо, - это «всего» порядок 10 ^ 17, что в основном незначительно по сравнению с любой ошибкой на верхнем конце данных. (Точка, обведенная кружком, — это максимальная ошибка на графике). Подгонка в линейном пространстве эффективна только для больших значений данных.

person agentp    schedule 30.03.2015
comment
Да, это выглядит лучше, но мне нужен полином :) Но я все еще в замешательстве: почему он терпит неудачу в линейном пространстве? Например, при уменьшении даты с xange 0 до 5 и выполнении линейной подгонки и построения графика возникает огромная ошибка. - person Botulus; 30.03.2015
comment
Хорошо, большое спасибо :) Теперь я вижу, что метод LeastSquare минимизирует абсолютную ошибку по всей функции, поэтому ошибка, возникающая в области с низким значением, все еще мала. - person Botulus; 31.03.2015