gifts2017

Простые алгоритмы численного решения задачи Коши для ОДУ

Опубликовал Михаил Гусев (Идальго) в раздел Программирование - Практика программирования

Представлена реализация на языке 1С8 простейших алгоритмов численного решения задачи Коши для обыкновенных дифференциальных уравнений (методы - Эйлера, Эйлера-Коши и Рунге-Кутта).
Статья является логическим продолжением предыдущей (http://infostart.ru/public/314372/).

Как и в предыдущей статье, в этой нет изложения теоретических основ представленных алгоритмов, но, при необходимости информацию легко можно найти в любой книге о численных методах, например - Е. А. Волков "Численные методы". Особое внимание нужно уделить вопросам выбора узлов и шага интегрирования, обеспечения требуемой точности вычислений, а также применимости и целесообразности выбора того или другого метода.  


В качестве интегрируемой функции возьмем в этот раз такую:

Функция Функция_2(х,у)
	Возврат Окр(Pow(х,2) + Pow(у,2),16);
КонецФункции	


Так будет выглядеть вызов расчетных функций и начальные условия:

Процедура ВыполнитьРасчет()
	Число_шагов = 500;	
	Х_нач 	= 1;
	Х_кон 	= 1.2;
	У_нач 	= 4;
	Сообщить("Метод Эйлера (1-ый пор.тчн.) = " + РассчитатьЭйлера(Х_нач, Х_кон, У_нач, Число_шагов));
	Сообщить("Метод Эйлера усовершенств. (2-ой пор.тчн.) = " + РассчитатьЭйлераУсовершенствованный(Х_нач, Х_кон, У_нач, Число_шагов));
	Сообщить("Метод Эйлера-Коши (2-ой пор.тчн.)	= " + РассчитатьЭйлераКоши(Х_нач, Х_кон, У_нач, Число_шагов));
	Сообщить("Метод Рунге-Кутта	(4-ый пор.тчн.) = " + РассчитатьРунгеКутта(Х_нач, Х_кон, У_нач, Число_шагов));

КонецПроцедуры	


Таким образом, имеется функция F(x;y)=x^2 + y^2, начальные условия (1;4), где x пробегает значения от 1 до 1,2. Требуется численно решить задачу Коши ОДУ. Число шагов - 500.


1) Метод Эйлера (первого порядка точности):

Функция РассчитатьЭйлера(Х_нач, Х_кон, У_нач, Число_шагов)
	h = (Х_кон-Х_нач)/Число_шагов;
	x = Х_нач;
	y = У_нач;
	Для й=0 По Число_шагов-1 Цикл
		y = y + h*Функция_2(x,y);
		x = x + h;
	КонецЦикла;	
	Возврат y;
КонецФункции

2) Метод Эйлера улучшенный (второго порядка точности):

Функция РассчитатьЭйлераУсовершенствованный(Х_нач, Х_кон, У_нач, Число_шагов)
	h = (Х_кон-Х_нач)/Число_шагов;
	x = Х_нач;
	y = У_нач;
	Для й=0 По Число_шагов-1 Цикл
		yрр = y + 0.5*h*Функция_2(x,y);
		y = y + h*(Функция_2(x+0.5*h,yрр));
		x = x + h;
	КонецЦикла;	
	Возврат y;
КонецФункции

3) Метод Эйлера-Коши (второго порядка точности):

Функция РассчитатьЭйлераКоши(Х_нач, Х_кон, У_нач, Число_шагов)
	h = (Х_кон-Х_нач)/Число_шагов;
	x = Х_нач;
	y = У_нач;
	Для й=0 По Число_шагов-1 Цикл
		yp = y + h*Функция_2(x,y);
		y = y + 0.5*h*(Функция_2(x,y) + Функция_2(x+h,yp));
		x = x + h;
	КонецЦикла;	
	Возврат y;
КонецФункции

4) Метод Рунге-Кутта (четвёртого порядка точности):

Функция РассчитатьРунгеКутта(Х_нач, Х_кон, У_нач, Число_шагов)
	h = (Х_кон-Х_нач)/Число_шагов;
	х = Х_нач;
	у = У_нач;
	Для й=0 По Число_шагов-1 Цикл
		К0 = Функция_2(х, у);
		К1 = Функция_2(х + 0.5*h, у + 0.5*h*К0);
		К2 = Функция_2(х + 0.5*h, у + 0.5*h*К1);
		К3 = Функция_2(х + h, у + h*К2);
		у = у + h*(К0 + 2*К1 + 2*К2 + К3)/6;
	    х = х + h;
	КонецЦикла;	
	Возврат у;
КонецФункции

Результат вычислений:

Метод Эйлера (1-ый пор.тчн.) = 22,18596991825004379496
Метод Эйлера усовершенств. (2-ой пор.тчн.) = 22,52108073259233371164
Метод Эйлера-Коши (2-ой пор.тчн.) = 22,5214513039223151306
Метод Рунге-Кутта (4-ый пор.тчн.) = 22,522188708188403111466666666666666666666666665999999992

См. также

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

Комментарии

1. Олег Сорокин (Oleg_nsk) 01.12.14 11:59
Всё хорошо. Один вопрос. Почему вы не остались на кафедре высшей математики, а занялись 1с?
valentio; talych; +2 Ответить 2
2. cmd_vasec (cmd_vasec) 01.12.14 12:01
Какое практическое применение данной публикации? Что численные методы быстрее работают на 1с чем на других языках?
3. cmd_vasec (cmd_vasec) 01.12.14 12:03
(1) Oleg_nsk,
1с -ки больше получают. А такой кафедры нет. У нас в городе Кафедра Компьютерного и Математического моделирования.
4. Михаил Гусев (Идальго) 01.12.14 15:51
(1) Oleg_nsk, я только недавно пришел в 1С и изучаю платформу, механизмы и конфигурации. И вообще, я еще учусь ))) А публикации нужны всякие.
5. Михаил Гусев (Идальго) 01.12.14 15:57
(2) cmd_vasec, это практическая реализация сабжа. Т.е., если нужно посчитать интеграл, то используя программы - можно получить решение. Дело не в том, с какой скоростью относительно других языков и т.п. работают эти алгоритмы в 1С. Главное, что они работают и с их помощью можно легко получить результаты.
Вот например недавно я сдавал вычислительные методы (практику) - ну так я на 1С все писал. А на вопрос почему - отвечал, что мне так удобнее, т.к. последнее время часто работаю с 1С. Ну, и действительно, нет заморочек с типизацией и т.п... Ах, ну и конечно, никто не собирается, как мне кажется, мега рассчеты вести на 1С, т.к. для этого существуют разнообразные математические программы или библиотеки.
6. cmd_vasec (cmd_vasec) 01.12.14 17:35
(5) Идальго,
Тогда надо делать библиотеку в которой собрать решения таких задач. Думаю, что работа с матрицами будет востребовано.
7. Олег Сорокин (Oleg_nsk) 03.12.14 10:38
(4) Идальго, Тогда предлагаю вам осуществить на 1с это. И второй вариант по алгоритму братьев Чудновских.
8. Михаил Гусев (Идальго) 03.12.14 14:45
(7) Oleg_nsk, спасибо за предложение конечно, но это мне пока не интересно.
9. Владимир (oberon355) 04.12.14 10:53
Здорово. Жаль только в жизни 1с ника это никак не востребовано.
10. Дмитрий Шаляпин (titan6662000) 09.12.14 07:10
Очень даже востребовано. Вот захотели защитить свою конфигурацию(обработку ...) от копипаста - применили сложный алгоритм, который не только сложно понять, но и быстрее работает = взяли и применили.
Осталось только подумать где и как. К тому же применение матики может существенно сжать код программы если думать вовремя. В планировании часто возникает потребность в сложных вычислениях. Были бы книги о том как применить то или иное множество решений сложных задач в реальной жизни (кто знает - подскажите), а то приходится самому выдумывать.
11. Михаил Гусев (Идальго) 11.12.14 17:20
(10) titan6662000,
Были бы книги о том как применить то или иное множество решений сложных задач в реальной жизни (кто знает - подскажите), а то приходится самому выдумывать.

Ну, наверное подойдет - Таха Х.А. "Введение в исследование операций".
EdmundoAlvares; +1 Ответить
12. Alex TPID (TPID) 11.12.14 17:23
Мдя. Мне сейчас предстоит метод наименьших квадратов реализовывать... но с диффурами, надеюсь, сталкиваться больше не придётся.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа