Программа решение дифференциального уравнения методом эйлера

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Switch branches/tags
Branches Tags
Could not load branches
Nothing to show
Could not load tags

Nothing to show

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Cancel Create

  • Local
  • Codespaces

HTTPS GitHub CLI
Use Git or checkout with SVN using the web URL.
Work fast with our official CLI. Learn more about the CLI.

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Решение системы дифференциальных уравнений методом Эйлера

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

fc6b315 Nov 4, 2018

Changelog: 1. Опечатоки вон 2. Зачем я пишу ченжлог если это никто читать не будет. Сразу удалю после проверки эту репу. _____________________ | _________________ | | | 1.228 | | | |_________________| | | ___ ___ ___ ___ | | | 7 | 8 | 9 | | + | | | |___|___|___| |___| | | | 4 | 5 | 6 | | — | | | |___|___|___| |___| | | | 1 | 2 | 3 | | x | | | |___|___|___| |___| | | | . | 0 | = | | / | | | |___|___|___| |___| | |_____________________| Кык, калькулятор

Git stats

Files

Failed to load latest commit information.

Latest commit message
Commit time

README.md

Variant 19 (Sukach Maxim, BS17-03)

  1. Уравнение
  2. Решение
  3. Метод Эйлера
  4. Усовершенствованный метод Эйлера
  5. Классический метод Рунге-Кутты
  6. Сравнение методов для заданной задачи
  7. Заключение
  8. Запуск
  9. Ссылки

В итоге, наше решение принимает вид:

Метод Эйлера дает возможность приближенно выразить функцию теоретически с любой наперед заданной точностью. Суть метода Эйлера в пошаговом вычислении значений решения y=y(x) дифференциального уравнения вида y’=f(x,y) с начальным условием (x0;y0). Метод Эйлера является методом 1-го порядка точности и называется методом ломаных.

Для вычисления используются следующие формулы:

def next_y(xi, yi): return yi + self.h * self.f(xi, yi) ys = [] xs = np.arange(x0 + h, xf + h, h) # вектор всех значений x for x in xs: ys.append(y) y = next_y(x, y) # В результате ys будет содержать все значения метода Эйлера

Метод Эйлера и точное решение при x0 = 0, xf = 9, y0 = 1, h = 0.1

Метод Эйлера

Метод Эйлера и точное решение при x0 = 0, xf = 3, y0 = 1, h = 0.1

Метод Эйлера и точное решение при x0 = 0, xf = 1, y0 = 1, h = 0.1

Усовершенствованный метод Эйлера

Суть усовершенствованного метода Эйлера в пошаговом вычислении значений решения y=y(x) дифференциального уравнения вида y’=f(x,y) с начальным условием (x0;y0). Усовершенствованный метод Эйлера является методом 2-го порядка точности и называется модифицированным методом Эйлера.

Разница между данным методом и методом Эйлера минимальна и заключается в использовании следующих формул:

Читайте также:
Когда началась программа умники и умницы

# Заменяем next_y функцию на эту: def next_y(xi, yi): h2 = h / 2 delta_y = h * f(xi + h2, yi + h2 * f(xi, yi)) return yi + delta_y

Усовершенствованный Метод Эйлера и точное решение при
x0 = 0, xf = 9, y0 = 1, h = 0.1

Усовершенствованный Метод Эйлера и точное решение при
x0 = 0, xf = 3, y0 = 1, h = 0.1

Усовершенствованный Метод Эйлера и точное решение при
x0 = 0, xf = 1, y0 = 1, h = 0.1

Классический метод Рунге-Кутты

Суть метода Рунге-Кутты в пошаговом вычислении значений решения y=y(x) дифференциального уравнения вида y’=f(x,y) с начальным условием (x0;y0). Классический метод Рунге-Кутты является методом 4-го порядка точности и называется методом Рунге-Кутты 4-го порядка точности.

Ну и как обычно, формулы:

# Заменяем next_y функцию на эту: def next_y(xi, yi): h2 = h / 2 k1 = f(xi, yi) k2 = f(xi + h2, yi + h2 * k1) k3 = f(xi + h2, yi + h2 * k2) k4 = f(xi + h, yi + h * k3) return yi + (h / 6) * (k1 + 2 * k2 + 2 * k3 + k4)

Классический метод Рунге-Кутты и точное решение при x0 = 0, xf = 9, y0 = 1, h = 0.1

Классический метод Рунге-Кутты и точное решение при x0 = 0, xf = 3, y0 = 1, h = 0.1

Классический метод Рунге-Кутты и точное решение при x0 = 0, xf = 1, y0 = 1, h = 0.1

Сравнение методов для заданной задачи

Размер ошибки всех методов на промежутке [0, 9] с шагом 0.1

Размер ошибки всех методов на промежутке [0, 3] с шагом 0.1

Размер ошибки всех методов на промежутке [0, 1] с шагом 0.1

Очевидно что, классический метод Рунге-Кутты справляется с задачей аппроксимации в случае данного уравнения намного лучше чем Метод Эйлера и Усовершенствованный метод Эйлера.

График глобальной средней ошибки

Глобальная ошибка в зависимости от размера шага H на промежутке от 0.01 до 0.91 для x0 = 1, xf = 9

  1. Установить Python3
  2. Все пакеты необходимые для работы находятся в requirements.txt matplotlib
    numpy
  3. Запустить run.py в корневой директории проекта.

Все настройки находятся в run.py в виде констант (строки 12-16). configparser очень не хотелось подключать. После запуска скрипт покажет 6 графиков (в диком разрешении, там ничего не видно толком) и сохранит их нормальные версии (dpi=300) в папке results.

Latex Редактор: https://www.codecogs.com/latex/eqneditor.php
Метод Эйлера: Wikipedia
Усовершенствованный метод Эйлера: Mathprofi (кык)
Метод Рунге — Кутты: Wikipedia

About

Differential Equations Course Assignment

Источник: github.com

Решение дифференциальных уравнений 1 порядка методом Эйлера — C (СИ)

Вот я написал программу, которая решает дифференциальные уравнения 1 порядка методом Эйлера (в данном случае y’=2а+y):

#include #include void main() < clrscr(); float a, b, y, h, n; char f; printf(«n Vvedite nachalo intervala «); scanf(«%f», printf(«n Vvedite konec intervala «); scanf(«%f», printf(«n Vvedite nachalnoe znachenie y(0)»); scanf(«%f», printf(«n Vvedite chislo shagov h»); scanf(«%f», f=2*a+y; h=(b-a)/n; printf(«n %f t %f», a, y); for(int i=0;i getch(); >

проблемма состоит в том, что мне нужно, чтобы после каждого нахождения

их новые значения автоматически вставлялись(заменяли старые значения а и у) в функцию f=2*a+y (21 строка), чтобы на ее основе вычислить новый у и т.д. Помогите плс! Скажите что мне нужно сделать!

Код к задаче: «Решение дифференциальных уравнений 1 порядка методом Эйлера»

Листинг программы

Читайте также:
Как в программе spu orb заполнить сзв тд

#include int main() < float a, b, y, h, n, f, y0; int i; printf(«n Vvedite nachalo intervala «); scanf(«%f», printf(«n Vvedite konec intervala «); scanf(«%f», printf(«n Vvedite nachalnoe znachenie y(0)»); scanf(«%f», printf(«n Vvedite chislo shagov h»); scanf(«%f», h=(b-a)/n; for(i=0;i getch(); >

Источник: studassistent.ru

Программа решение дифференциального уравнения методом эйлера

Nickolay.info. Алгоритмы. Решение задачи Коши методом Эйлера

1. Типы задач для обыкновенных дифференциальных уравнений

Обыкновенные дифференциальные уравнения (ОДУ) широко используются для математического моделирования процессов и явлений в различных областях науки и техники. Переходные процессы в радиотехнических цепях, кинетика химических реакций, динамика биологических популяций, движение космических объектов, модели экономического развития исследуются с помощью ОДУ.

В дифференциальное уравнение n-го порядка в качестве неизвестных величин входят функция у(х) и её первые n производных по аргументу х.

(1)

Из теории ОДУ известно, что уравнение (1) эквивалентно системе n уравнений первого порядка

(2)

Уравнение (1) и эквивалентная ему система (2) имеют бесконечное множество решений. Единственные решения выделяют с помощью дополнительных условий, которым должны удовлетворять искомые решения. В зависимости от вида таких условий рассматривают три типа задач, для которых доказано существование и единственность решений.

Первый тип — это задачи Коши, или задачи с начальными условиями. Для таких задач кроме исходного уравнения (1) в некоторой точке х0 должны быть заданы начальные условия, т.е. значения функции у(х) и ее производных

Для системы ОДУ типа (2) начальные условия задаются в виде

(3)

Ко второму типу задач относятся так называемые граничные, или краевые задачи, в которых дополнительные условия задаются в виде функциональных соотношений между искомыми решениями. Количество условий должно совпадать с порядком n уравнения или системы. Если решение задачи определяется в интервале x принадлежит [х0, хk], то такие условия могут быть заданы как на границах, так и внутри интервала. Минимальный порядок ОДУ, для которых может быть сформулирована граничная задача, равен двум.

Третий тип задач для ОДУ — это задачи на собственные значения. Такие задачи отличаются тем, что кроме искомых функций у(х) и их производных в уравнения входят дополнительно m неизвестных параметров λ1, λ2, …, λm, которые называются собственными значениями. Для единственности решения на интервале [х0, хk] необходимо задать n+m граничных условий. В качестве примера можно назвать задачи определения собственных частот, коэффициентов диссипации, структуры электромагнитных полей и механических напряжений в колебательных системах, задачи нахождения фазовых коэффициентов, коэффициентов затухания, распределения напряженностей полей волновых процессов и т. д.

К численному решению ОДУ приходится обращаться, когда не удается построить аналитическое решение задачи через известные функции. Хотя для некоторых задач численные методы оказываются более эффективными даже при наличии аналитических решений.

Большинство методов решения ОДУ основано на задаче Коши, алгоритм решения которой рассматривается далее.

2. Метод Эйлера

Систему ОДУ (2) часто удается представить в каноническом виде, в так называемой форме Коши

(4)

При формулировке задачи Коши система (4) дополняется начальными условиями (3). Для простоты рассмотрим задачу Коши для одного уравнения типа (4), а затем полученные алгоритмы обобщим на систему n уравнений

(5)

В окрестности точки х0 функцию у(х) разложим в ряд Тейлора

(6)

который можно применить для приближенного определения искомой функции у(х). В точке х0 + h при малых значениях h можно ограничиться двумя членами ряда (6), тогда

Читайте также:
В программе 1с бухгалтерия средства настройки пользовательского интерфейса позволяют

(7)

где O(h 2 ) — бесконечно малая величина порядка h 2 . Заменим производную у'(x0), входящую в формулу (7), на правую часть уравнения (5):

(8)

Теперь приближенное решение в точке х1 = х0 + h можно вновь рассматривать как начальное условие и по формуле (8) найти значение искомой функции в следующей точке х2 = x1 + h1. В результате получен простейший алгоритм решения задачи Коши, который называется методом Эйлера, или методом ломаных. Последнее название связано с геометрической интерпретацией процесса (см. рис.); искомую функцию у(х) мы заменяем ломаной линией, представляющей собой отрезки касательных к этой функции в узлах

Рис. Метод Эйлера

Формула (8) может быть получена из других соображений. Заменим производную в левой части уравнения (5) приближенным конечно-разностным отношением

Нетрудно видеть эквивалентность последнего выражения с алгоритмом Эйлера (8).

На каждом шаге метода Эйлера решение у(х) определяется с погрешностью за счет отбрасывания членов ряда Тейлора, пропорциональных h в степени выше первой. Это означает, что метод Эйлера имеет второй порядок локальной погрешности. Доказано, что глобальная погрешность метода имеет первый порядок; и при постоянном шаге h для оценки погрешности применима первая формула Рунге

, (9)

где yh(x) — приближенное решение дифференциального уравнения в точке х, полученное с шагом h; уkh(х) — приближенное решение того же уравнения с шагом kh; р — порядок метода.

Формула (9) позволяет опытным путем определить шаг h, обеспечивающий требуемую точность решения у(х). Так же, как и при вычислении определенных интегралов, можно осуществлять автоматическое изменение шага в процессе интегрирования дифференциального уравнения.

Для уточнения решения применима вторая формула Рунге

(10)

Формула Эйлера (8) обобщается для систем ОДУ, записанных в форме Коши (4) с начальными условиями (3)

(11)

Представленная ниже программа реализует метод Эйлера решения задачи Коши для системы дифференциальных уравнений. Функция уравнения задаётся подпрограммой f(x), точное решение – подпрограммой ft(x). Пользователь вводит интервал поиска решения [A,B], число шагов N, начальное значение Y(0). Программа выводит найденное решение и оценивает его максимальную погрешность.

program Eyler; uses crt; var i,n:integer; a,b,h,x,x0,y,y0,eps,emax:real; function f(x,y:real):real; begin f:=y/x-4/sqr(x); end; function ft(x:real):real; begin ft:=2/x; end; begin clrscr; writeln (‘Решение задачи Коши методом Эйлера’); writeln (‘Уравнение dy/dx=y/x-4/sqr(x)’); write (‘Введите интервал поиска решения [A,B]: ‘); read (a,b); write (‘Введите число шагов N: ‘); readln (n); h:=(b-a)/n; x0:=a; write (‘Введите начальное значение Y(0): ‘); read(y0); y:=y0; x:=x0; emax:=0; writeln (‘X’:19,’Y’:19,’Eps’:19); for i:=1 to n+1 do begin y:=y+h*f(x,y); eps:=abs(y-ft(x)); if eps>emax then emax:=eps; writeln (x:19:8,y:19:8,eps:19:8); x:=x+h; end; writeln (‘Pmax=’,emax:19:8); reset (input); readln; end.

Вот примеры вывода этой программы.

Решение задачи Коши методом Эйлера Уравнение dy/dx=y/x-4/sqr(x) Введите интервал поиска решения [A,B]: 1 3 Введите число шагов N: 10 Введите начальное значение Y(0): 2 X Y Eps 1.00000000 1.60000000 0.40000000 1.20000000 1.31111111 0.35555556 1.40000000 1.09024943 0.33832200 1.60000000 0.91403061 0.33596939 1.80000000 0.76867599 0.34243512 2.00000000 0.64554359 0.35445641 2.20000000 0.53894011 0.37015080 2.40000000 0.44496290 0.38837043 2.60000000 0.36084762 0.40838315 2.80000000 0.28458163 0.42970408 3.00000000 0.21466485 0.45200181 Pmax= 0.45200181 . Введите число шагов N: 10000 . X Y Eps . 2.99999999 0.66623701 0.00042965 Pmax= 0.00042965

Источник: nickolay.info

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru