Страница 1 из 1

МНК в Maple

Добавлено: Вт май 05, 2015 2:15 am
Gickle
Доброго времени суток.

В общем, столкнулся с тем, что не могу корректно применить метод наименьших квадратов в Maple (версия 18 ). Собственно говоря, задача следующая: имеется массив X, массив Y, нужно аппроксимировать Y(X) некоторой функцией y(x) (которая имеет следующий вид: y = a*exp(-x/b) + c*exp(-x/d)). По неизвестным мне причинам сделать это не получается. Что пробовал:

Код: Выделить всё

X := convert(X, vector);

Y := convert(Y, vector);

with(Statistics);
NonlinearFit(a*exp(-x/b)+c*exp(-x/d), X, Y, x);
HFloat(1.3136669119112754) exp(-HFloat(0.19979530781052626) x)

   - HFloat(1.1048535672172564) exp(-HFloat(0.21460979246150352) x

  )


Выдаёт, мягко говоря, совсем не то, что ожидается.
X, Y пробовал конвертировать во все возможные (как мне кажется) форматы. Кроме того, пробовал:

Код: Выделить всё

with(stats);
ls := fit[leastsquares[[x, y], y = a*exp(-x/b)+c*exp(-x/d)]]([X, Y]);
Error, (in stats/find_function) function requested does not exist: leastsquares args are:: leastsquares[[x, y], y = a*exp(-x/b)+c*exp(-x/d)] ::


Пытался также использовать пакет DirectSearch (вот в этой теме увидел: http://forum.exponenta.ru/viewtopic.php ... statistics ) - безрезультатно. В общем, бился с гуглом и хелпом в течение нескольких часов, прежде чем решил обратиться сюда. Будьте так добры, подскажите начинающему пользователю Maple, где он ошибся.

Re: МНК в Maple

Добавлено: Вт май 05, 2015 11:54 am
Spinosaurus
Gickle писал(а):Доброго времени суток.
В общем, столкнулся с тем, что не могу корректно применить метод наименьших квадратов в Maple (версия 18 ). Собственно говоря, задача следующая: имеется массив X, массив Y, нужно аппроксимировать Y(X) некоторой функцией y(x) (которая имеет следующий вид: y = a*exp(-x/b) + c*exp(-x/d)).

Выложите, пожалуйста, примеры массивов X и Y, так как ваш код абсолютно корректно работает, если задавать случайные массивы размерностью 10 с помощью команды LinearAlgebra:-RandomVector(10).

Re: МНК в Maple

Добавлено: Вт май 05, 2015 3:55 pm
Gickle
Spinosaurus писал(а):
Gickle писал(а):Доброго времени суток.
В общем, столкнулся с тем, что не могу корректно применить метод наименьших квадратов в Maple (версия 18 ). Собственно говоря, задача следующая: имеется массив X, массив Y, нужно аппроксимировать Y(X) некоторой функцией y(x) (которая имеет следующий вид: y = a*exp(-x/b) + c*exp(-x/d)).

Выложите, пожалуйста, примеры массивов X и Y, так как ваш код абсолютно корректно работает, если задавать случайные массивы размерностью 10 с помощью команды LinearAlgebra:-RandomVector(10).

Массив X:
10.46
13.46
16.46
19.46
22.46
25.46
28.46
31.46
34.46
37.46
40.46
43.46
46.46
49.46
52.46
55.46
58.46
61.46
64.46
67.46
70.46
73.46
76.46
79.46
82.46
85.46
88.46
91.46
94.46
97.46
100.46
103.46
106.46
121.46
136.46
151.46
166.46
181.46
196.46
211.46
226.46
241.46
256.46
271.46
286.46
301.46
316.46
331.46
346.46
361.46
376.46
391.46
406.46
421.46
436.46
451.46
466.46
481.46
496.46
511.46
526.46
541.46
556.46
571.46
586.46
601.46
616.46
631.46
646.46
661.46
676.46
691.46
706.46
721.46

Массив Y:
4093
3613
3620
3328
3068
2827
2646
2450
2345
2154
2126
1826
1745
1603
1536
1417
1406
1336
1248
1241
1117
1073
1106
973
936
848
805
841
784
752
735
685
666
569.2
488.8
426
388.6
347.2
333
297.4
276.2
255.2
236.2
218.6
202
184
175.8
154
149
129.6
123.6
113.4
104.4
92.2
90
81.2
77.6
72.2
67.8
60.6
49.8
52.4
48.4
45.8
48
38.8
42.8
37.6
27
26.8
23.8
23.8
25.6
24.4

На выходе было, как я уже сказал, что-то совсем-совсем не то.
P.S. Мне, вообще говоря, нужно работать в полулогарифмическом масштабе (то есть зависимость lnY от X интересует), а тут Maple совсем сверхъестественные вещи выдаёт (здесь, разумеется, я уже брал массив логарифмов):

Код: Выделить всё

with(Statistics);
NonlinearFit(ln(a*exp(-t/b)+c*exp(-t/d)), X, Y, t);
Error, (in Statistics:-NonlinearFit) complex value encountered

То есть он, видимо, считает, что под знаком логарифма должны появится неположительные числа при аппроксимации. Если же попробовать работать с модулем, то выдаёт следующее (для удобства картинки прикреплю).
[/img]
Изображение
Изображение

Re: МНК в Maple

Добавлено: Вт май 05, 2015 8:03 pm
Spinosaurus
Gickle писал(а):Массив X... Массив Y...

Думал вы txt-файл коротенький сделаете, а вы так засандалили. Ну, да ладно... теперь по-существу
Мне, вообще говоря, нужно работать в полулогарифмическом масштабе (то есть зависимость ln (Y) от X интересует

Возможно вам и не нужна такая сложная модельная функция? Достаточно будет взять ln(y), а модельной функцией выбрать z=(ln(y))=a*x+b. А потом просто exp(a*x+b).
Но если всё же нужны параметры для вашей модельной функции, то придётся задать диапазон параметров "parameterranges" (когда вы этот диапазон зададите сразу исчезнет ошибка: "Error, (in Statistics:-NonlinearFit) complex value encountered"), и скорее всего начальные значения параметров (откуда начинать подбор). Рекомендую использовать и NonlinearFit и DataFit из пакета DirectSearch. И выбрать из обоих результатов лучший.

Re: МНК в Maple

Добавлено: Вт май 05, 2015 9:10 pm
Gickle
Spinosaurus писал(а):
Gickle писал(а):Массив X... Массив Y...

Думал вы txt-файл коротенький сделаете, а вы так засандалили. Ну, да ладно... теперь по-существу
Мне, вообще говоря, нужно работать в полулогарифмическом масштабе (то есть зависимость ln (Y) от X интересует

Возможно вам и не нужна такая сложная модельная функция? Достаточно будет взять ln(y), а модельной функцией выбрать z=(ln(y))=a*x+b. А потом просто exp(a*x+b).
Но если всё же нужны параметры для вашей модельной функции, то придётся задать диапазон параметров "parameterranges" (когда вы этот диапазон зададите сразу исчезнет ошибка: "Error, (in Statistics:-NonlinearFit) complex value encountered"), и скорее всего начальные значения параметров (откуда начинать подбор). Рекомендую использовать и NonlinearFit и DataFit из пакета DirectSearch. И выбрать из обоих результатов лучший.

Извиняюсь, не подумал что-то насчёт величины массива. Вроде сейчас что-то более-менее вразумительное получилось. Ещё вопрос всё-таки задам, если не против:
Касательно DirectSearch:

Код: Выделить всё

with(DirectSearch);
NonlinearFit(ln(a*exp(-t/b)+c*exp(-t/d)), X, Y, t, initialvalues = [a = 3000, b = 100, c = 1000, d = 40], parameterranges = [a = 2000 .. 4000, b = 80 .. 130, c = 500 .. 1500, d = 30 .. 70]);

На выходе он мне выдаёт то же самое выражение, просто подставляет непосредственно массивы X и Y. Пытался делать в формате list - аналогично. В чём я ошибаюсь? Вроде как пакет установил (ну, то есть банально в папку lib скинул 2 файлика). Что я могу делать не так?

Re: МНК в Maple

Добавлено: Вт май 05, 2015 10:03 pm
Spinosaurus
Gickle писал(а):Извиняюсь, не подумал что-то насчёт величины массива. Вроде сейчас что-то более-менее вразумительное получилось. Ещё вопрос всё-таки задам, если не против:
Касательно DirectSearch...

Я бы порекомендовал вызывать функции из библиотек по-другому, например:

Код: Выделить всё

Statistics:-NonlinearFit( );
SignalProcessing:-DFT( );

Тогда команд: with(Statistics); и т.п. вызывать не нужно.
Это несколько удлинит запись, зато не будут "накладываться" команды из разных библиотек.
Что касается DirectSearch, он устанавливается так:
1. DirectSearch.mla из папки EnglishVersion кидаете в папку lib, где установлен Maple. Например: d:\Program Files\Maple 18\lib\
2. DirectSearch.hdb из папки RussianVersion кидаете папку lib, где установлен Maple.
3. Открываете новый worksheet и пишите команду:

Код: Выделить всё

HelpTools:-Database:-ConvertAll():

4. Перезагружаете Maple.

Тогда у вас будет английская версия DirectSearch, с русским help'ом. Команда, которую вы должны использовать:

Код: Выделить всё

DirectSearch:-DataFit()

У вас в вопросе вы вызываете команду NonlinearFit, которая отсутствует в библиотеке DirectSearch.
Нужно вызывать так:

Код: Выделить всё

sol:=DirectSearch:-DataFit(ln(a*exp(-t/b)+c*exp(-t/d)), [2000<=a<=4000, 80<=b<=130, 500<=c<=1500, 30<=d<=70], X, Y, t, initialpoint=[a = 3000, b = 100, c = 1000, d = 40], fitmethod=ТОТ КОТОРЫЙ ВЫ ЗАХОТИТЕ);
assign(sol[2]); #после этой команды найденные значения a,b,c,d будут присвоены переменным a,b,c,d соответственно

P.S. Там где у команд (), в скобках нужно писать тот формат вызова, который указан в help.

Re: МНК в Maple

Добавлено: Ср май 06, 2015 1:18 pm
Spinosaurus
Gickle писал(а):Что я могу делать не так?

Ну, как? У вас получилось?
P.S. Забыл дать ссылку на DirectSearch v.2:
http://www.maplesoft.com/applications/view.aspx?SID=101333

Re: МНК в Maple

Добавлено: Ср май 06, 2015 8:11 pm
Gickle
Spinosaurus писал(а):
Gickle писал(а):Что я могу делать не так?

Ну, как? У вас получилось?
P.S. Забыл дать ссылку на DirectSearch v.2:
http://www.maplesoft.com/applications/view.aspx?SID=101333

Спасибо, библиотека по крайней мере заработала. А вот попыткой добавить библиотеку что-то не заладилось:

Код: Выделить всё

Error, (in HelpTools:-HelpCallUI) cannot create help database: 'unable to open database file'


Причём во время выполнения выдавал следующее:

Код: Выделить всё

"Converting C:\\Program Files\\Maple 18\\lib\\DirectSearch.hdb to C:\\Program Files\\Maple 18\\lib\\DirectSearch.help"
Warning, .hdb help databases are deprecated, 'C:\Program Files\Maple 18\lib\DirectSearch.hdb' will not be used, see ?HelpTools,Migrate help page for more information


То есть вроде как пытался, предупредил, что .hdb является устаревшим, но в итоге ничего не сделал.

Re: МНК в Maple

Добавлено: Ср май 06, 2015 10:22 pm
Spinosaurus
Gickle писал(а):Причём во время выполнения выдавал следующее:

Код: Выделить всё

"Converting C:\\Program Files\\Maple 18\\lib\\DirectSearch.hdb to C:\\Program Files\\Maple 18\\lib\\DirectSearch.help"
Warning, .hdb help databases are deprecated, 'C:\Program Files\Maple 18\lib\DirectSearch.hdb' will not be used, see ?HelpTools,Migrate help page for more information


То есть вроде как пытался, предупредил, что .hdb является устаревшим, но в итоге ничего не сделал.

Всё правильно, так и должно быть. Я же написал, что нужно перезапустить Maple, после команды:HelpTools:-Database:-ConvertAll():. Просто закройте Maple, и потом запустите его снова.