Подгонка модельной функции к данным используя NonlinearFit()

Форум пользователей пакета Maple

Модератор: Admin

sabbath
Сообщения: 148
Зарегистрирован: Сб апр 03, 2010 12:40 pm
Откуда: Днепропетровск

Подгонка модельной функции к данным используя NonlinearFit()

Сообщение sabbath » Вс апр 28, 2013 3:48 pm

Здравствуйте Уважаемые Знатоки!
На постановку вопроса меня подтолкнул пост по аппроксимации кривой http://forum.exponenta.ru/viewtopic.php?t=12715 . Решил и я воспользоваться советом!
В общем: есть данные
b := Array([0., .34, .75, 1.06, 1.35, 1.62, 1.7, 1.77, 1.8, 1.809, 1.82]):
h := Array([0., 7.50, 13.44, 17.81, 22.63, 30.69, 39.19, 55.63, 121.25, 250, 450]):

строю сплайновую аппроксимацию:
hb := convert(zip(`[]`, h, b), list);
splcurve1 := Spline(hb, x, degree = 1);

ну а теперь буру известную функцию (a2*arctan(b2*t)+c2*t, a2, b2, c2 - соответственно коэффициенты аппроксимации) которая способна описать кривую, заданную в массивах и использую NonlinearFit() для определения коэффициентов аппроксимации функции:
e := NonlinearFit(a2*arctan(b2*t)+c2*t, h, b, t, output = [leastsquaresfunction, residuals]);
f2 := unapply(e[1], t);

еще произвожу дополнительные манипуляции и вывожу результат на график:
Hmax := proc (t) options operator, arrow; j*sin(w*t) end proc; value(Hmax(t));
Bmax1 := proc (t) options operator, arrow; f2(Hmax(t)) end proc; value(Bmax1(t));
graph := Vector(1 .. 2);
graph[1] := plot([Hmax(t), Bmax1(t), t = 0 .. 0.5e-2], axis = [gridlines = [color = green, majorlines = 2]], color = black);
graph[2] := plot(splcurve1, x = 0 .. j, color = red);
display(convert(graph, list));

в результате получаю два графика с значительным не соответствием (погрешностью), а используя МНК, в ручную прописываю все, то кривые почти совпадают.
Так вот вопрос: Подскажите, как более точно сопоставить кривые по исходным данным и используя NonlinearFit()? и есть ли еще вложенные инструменты в мапле для решения подобной задачи?
Спасибо!
p.s. Задавая пределы коэффициентов аппроксимации функции в NonlinearFit() то получалось, что коэффициенты равнялись максимальному значению пределов!

Markiyan Hirnyk
Сообщения: 1335
Зарегистрирован: Вс дек 04, 2011 11:07 pm

Голословные утверждения

Сообщение Markiyan Hirnyk » Вс апр 28, 2013 7:28 pm

sabbath писал(а):Здравствуйте Уважаемые Знатоки!
На постановку вопроса меня подтолкнул пост по аппроксимации кривой http://forum.exponenta.ru/viewtopic.php?t=12715 .
в результате получаю два графика с значительным не соответствием (погрешностью), а используя МНК, в ручную прописываю все, то кривые почти совпадают.
Так вот вопрос: Подскажите, как более точно сопоставить кривые по исходным данным и используя NonlinearFit()?
Задавая пределы коэффициентов аппроксимации функции в NonlinearFit() то получалось, что коэффициенты равнялись максимальному значению пределов!

Пожалуйста, приведите соответствующие коды и их результаты.

sabbath
Сообщения: 148
Зарегистрирован: Сб апр 03, 2010 12:40 pm
Откуда: Днепропетровск

Re: Голословные утверждения

Сообщение sabbath » Пн апр 29, 2013 1:32 pm

Markiyan Hirnyk писал(а):
sabbath писал(а):Здравствуйте Уважаемые Знатоки!
На постановку вопроса меня подтолкнул пост по аппроксимации кривой http://forum.exponenta.ru/viewtopic.php?t=12715 .
в результате получаю два графика с значительным не соответствием (погрешностью), а используя МНК, в ручную прописываю все, то кривые почти совпадают.
Так вот вопрос: Подскажите, как более точно сопоставить кривые по исходным данным и используя NonlinearFit()?
Задавая пределы коэффициентов аппроксимации функции в NonlinearFit() то получалось, что коэффициенты равнялись максимальному значению пределов!

Пожалуйста, приведите соответствующие коды и их результаты.

e := NonlinearFit(a2*arctan(b2*t)+c2*t, h, b, t, parameterranges = [a2 = 0 .. 30, b2 = 0 .. 10, c2 = -10 .. 10], output = [leastsquaresfunction, residuals]);
a2 = 1.45024493270549, b2 = 0.533815932403277e-1, c2 = -0.104069860297583e-2
а используя метод наименьших ограниченных квадратов получаю a2 = 1.32792000920624, b2 = 0.766449555394406e-1, c2 = -0.497873454575755e-3
что очень хорошо приближается к заданным данным...
Но, я так понимаю и NonlinearFit() имеет тонкие настройки, о которых я не догадываюсь!

Markiyan Hirnyk
Сообщения: 1335
Зарегистрирован: Вс дек 04, 2011 11:07 pm

FitData

Сообщение Markiyan Hirnyk » Пн апр 29, 2013 9:55 pm

Да, действительно, Ваше решение лучше решения, найденного командой
e := Statistics:-NonlinearFit(a2*arctan(b2*t)+c2*t, h, b, t, parameterranges = [a2 = 1 .. 3, b2 = 0 .. 1, c2 = -0.1e-3 .. 0.1e-3], output = [leastsquaresfunction, residuals])
[1.28601258072813*arctan(0.646914232221621e-1*t)-0.100000000000000e-3*t, Vector(4, {(1) = ` 1 .. 11 `*Vector[row], (2) = `Data Type: `*float[8], (3) = `Storage: `*rectangular, (4) = `Order: `*Fortran_order})].
Можно, конечно, указать узкие интервалы параметров, содержащие Ваше решение, и тогда найти его, однако это не решает проблему. Дело в том, что команды Fit и NonlinearFit находят локальный минимум целевой функции, равной сумме квадратов отклонений теоретических значений от опытных. Другие методы подбора параметров не предусмотрены и в справке это отмечено. Вы же используете "метод ограниченных наименьших квадратов". Понятно, что этот метод можно запрограммировать. Однако не надо изобретать велосипед. Есть пакет DirectSearch (см. http://forum.exponenta.ru/viewtopic.php ... rectsearch ), содержащий команду FitData с несколькими методами подбора параметров. Вот результат ее применения:
with(DirectSearch):
f := A*arctan(B*x)+C*x;

A arctan(B x) + C x
sol := DataFit(f, h, b, x, fitmethod = lws);

[HFloat(0.006463360725082812), [A = HFloat(1.3242446091829208), B = Float(0.077614209132432), C = Float(-4.870035920546712e-4)
], 1729]

Полагаю, что комментарии излишни.

sabbath
Сообщения: 148
Зарегистрирован: Сб апр 03, 2010 12:40 pm
Откуда: Днепропетровск

Сообщение sabbath » Пн апр 29, 2013 10:52 pm

Markiyan Hirnyk, Огромное Спасибо! Я уже воспользовался ВАШЕЙ помощью! и нашел оптимальное решение из множества с помощью пакета DirectSearch! Много методов интересных!
Тема закрыта!