2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Зависимость времени инт-ия от формы коэф. метода Рунге-Кутта
Сообщение15.05.2006, 12:12 


11/06/05
8
Orel
Странная зависимость наблюдалась мной при численном интегрировании никоторой системы уравнений методом Рунге-Кутта. Если взять коэффициенты схемы в форме рациональных дробей, то общее время оказывалось Х с. Если те же самые коэффициенты в той же самой схеме подставить в вещественной форме (с плавающей точкой), то время интегрирования при всех прочих равных условий заняло 90*Х с.
Использовался метод Рунге-Кутта 4-5 порядка с адаптацией шага.
Я думаю, что и в методах более низкого порядка будет наблюдаться подобный разрыв.

А ведь это странно! Ведь в какой бы форме мы не подставляли бы коэффициенты при расчете они все равно интерпретатором (системы программирования или системы компьютерной математики) в конечном итоге преобразуются в форму с плавающей запятой, разве нет?

 Профиль  
                  
 
 
Сообщение15.05.2006, 12:33 


11/06/05
8
Orel
Попросили указать среду. Среда Matlab 7.0.1.24704 (R14) (SP1)

 Профиль  
                  
 
 
Сообщение15.05.2006, 12:40 
Экс-модератор
Аватара пользователя


23/12/05
12047
Ага, тогда давайте код - посмотрим
Вы использовали функцию ode45()?

 Профиль  
                  
 
 
Сообщение17.05.2006, 17:17 


11/06/05
8
Orel
Нет, конечно, я использовал не функцию ode45, поскольку речь идет о КОЭФФИЦИЕНТАХ алгоритма, которые черт знает где в стандартной функции ode45 прописаны. Я писал стандартные алгоритмы 23, 34, 45 с нуля в m-файле.

 Профиль  
                  
 
 
Сообщение17.05.2006, 17:22 
Экс-модератор
Аватара пользователя


23/12/05
12047
1) Это я догадался. Я имел в виду: Вы не пробовали использовать стандартную и сравнить с ней свои? Скорее всего, оба Ваших варианта проиграют.

Вопрос: Зачем Вам писать свои, если есть готовое? (Конечно, если надо, то надо)

2) Давайте коды m-файлов: посмотрим, поэкспериментируем вместе.

А вот Вам цитата из файла ode45.m, начиная со строки 244:
Код:
% Initialize method parameters.
pow = 1/5;
A = [1/5; 3/10; 4/5; 8/9; 1; 1];
B = [
    1/5         3/40    44/45   19372/6561      9017/3168       35/384
    0           9/40    -56/15  -25360/2187     -355/33         0
    0           0       32/9    64448/6561      46732/5247      500/1113
    0           0       0       -212/729        49/176          125/192
    0           0       0       0               -5103/18656     -2187/6784
    0           0       0       0               0               11/84
    0           0       0       0               0               0
    ];
E = [71/57600; 0; -71/16695; 71/1920; -17253/339200; 22/525; -1/40];

 Профиль  
                  
 
 Re: Зависимость времени инт-ия от формы коэф. метода Рунге-К
Сообщение17.05.2006, 17:40 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Artem_ писал(а):
Ведь в какой бы форме мы не подставляли бы коэффициенты при расчете они все равно интерпретатором (системы программирования или системы компьютерной математики) в конечном итоге преобразуются в форму с плавающей запятой, разве нет?

Если говорить о представления данных в компьютере, то разница существует, причем на нескольких уровнях. $1/5$ -- точное число, в то время как $0.2$ уже будет представлено приближенно. Кроме того, на уровне команд / интерпертатора это могут быть очень разные операции. Ошибки же округления могут вести к уменьшению шага интегрирования, что, в свою очередь, к замедлению.

Ну и наконец, самый простой вариант -- проверить, все ли коэффициенты подсчитаны правильно. Ошибка в вычислении коэффициентов (или их представление с недостаточной точностью) -- самое простое объяснение. Был у меня случай, один товарищ $\pi$ тройкой аппроксимировал... Долгонько искали...

 Профиль  
                  
 
 Re: Зависимость времени инт-ия от формы коэф. метода Рунге-К
Сообщение17.05.2006, 17:52 
Экс-модератор
Аватара пользователя


23/12/05
12047
незванный гость писал(а):
:evil:
Artem_ писал(а):
Ведь в какой бы форме мы не подставляли бы коэффициенты при расчете они все равно интерпретатором (системы программирования или системы компьютерной математики) в конечном итоге преобразуются в форму с плавающей запятой, разве нет?

Если говорить о представления данных в компьютере, то разница существует, причем на нескольких уровнях. $1/5$ -- точное число, в то время как $0.2$ уже будет представлено приближенно. Кроме того, на уровне команд / интерпертатора это могут быть очень разные операции. Ошибки же округления могут вести к уменьшению шага интегрирования, что, в свою очередь, к замедлению.

На самом деле, ситуация действительно странная: у MatLAB по умолчанию все числа имеют тип double, т.е., по идее, дополнительная операция деления должна замедлять работу. Я сейчас попробовал на своем компьютере два простеньких примера:
Код:
tic, for i=1:1e5 a=i*0.2;end, toc
и
Код:
tic, for i=1:1e5 a=i*(1/5);end, toc

В первом случае устойчиво получается быстрее примерно в 1.3 раза, а вот Artem_ говорит, что у него с дробями быстрее, причем гораздо, и в стандартном MatLAB-файле дроби, не думаю, что тут разработчики прошляпили. В общем, действительно странно.

 Профиль  
                  
 
 Re: Зависимость времени инт-ия от формы коэф. метода Рунге-К
Сообщение18.05.2006, 07:37 


02/05/06
56
Artem_ писал(а):
Странная зависимость наблюдалась мной при численном интегрировании никоторой системы уравнений методом Рунге-Кутта. Если взять коэффициенты схемы в форме рациональных дробей, то общее время оказывалось Х с. Если те же самые коэффициенты в той же самой схеме подставить в вещественной форме (с плавающей точкой), то время интегрирования при всех прочих равных условий заняло 90*Х с.
Использовался метод Рунге-Кутта 4-5 порядка с адаптацией шага.

1) А результаты-то совпадают?
2) Раз уж все пишете сами, перепишите на Фортран (С), должно работать еще быстрее
3) Как известно, программ (речь в данном случае о matlab) без ошибок не бывает
4) Привели бы оба текста - проще было бы советовать

 Профиль  
                  
 
 
Сообщение18.05.2006, 13:28 


11/06/05
8
Orel
Огромное спасибо г-ну photon_у за ценный совет.

Действительно, чтобы не грешить на ошибки, допущенные в своем коде, давайте изменим код стандартной Matlab_овской функции и посмотрим что получиться.
Для этого:
1 копируем из каталога
\MATLAB701\toolbox\matlab\funfun\ в свой рабочий каталог файл ode45.m переименовав его, например, в ode451.m.
2 исправляем в этом файле, начиная со строки 265, 4 вектора: pow, A, B, E заменив в них дроби на числа с плавающей точкой.
3 копируем из каталога
\MATLAB701\toolbox\matlab\funfun\private\ в свой рабочий каталог функции odearguments.m, ntrp45.m, odemass.m, odeevents.m, odefinalize.m, поскольку ode45 обращается к этим функциям в процессе.
Затем вы можете попробовать решить нек. задачу решателем ode45 и с теми же условиями решателем ode451.
Даже не используя циклы вы увидите разницу. Во-первых, итоговый вектор решения будет длиннее при использовании ode451, во-вторых, время расчета увеличиться.
Увеличение времени при одном расчете вашей задачи будет возможно несущественным. В моем случае оно составляло от 10% до 20%, но если Вам нужно (как в моем случае) решать систему в цикле или на большом временном интервале, то получается ого-го.

Так вот и получается, что наша небольшая невинная шутка - замена дробей на плавующую точку приводит в Matlab_е к неприятностям.

Ваши комментарии?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group