Решение дифференциальных уравнений на языке с

Как написать программу решения дифференциального уравнения… ( C++ )

Для численного решения обыкновенных дифференциальных уравнений различают задачи с начальными условиями (ЗНУ) и граничными условиями (ЗГУ).

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

Поэтому, для однозначного определения данной константы С, у искомой функции должны задаваться еще граничные условия, указывающие, что делается на концах исследуемого интервала, и/или начальные условия, описывающие значение функции
в начальный момент (t = 0). Совокупность граничных и начальных условий называется краевыми условиями.

Для численного решения обыкновенных дифференциальных уравнений применяют метод Рунге-Кутта, с наиболее часто используемым 4-ым порядком точности. Давайте рассмотрим программную реализацию данного метода Рунге-Кутта, и Вы увидите, что написать программу для решения дифференциального уравнения не составляет особого труда.

Вариант решения задачи рассмотрю на следующем примере:

Условия задачи:
Пусть выстрел из орудия произведен с начальной скоростью V0, под углом к горизонту α, с высоты Н0 расположения орудия, т.к. в реальности огонь может вестись с холма или из капонира (т.е. ниже уровня земли).
Считаем, что снаряд имеет форму шара с радиусом r, изготовлен из материала, имеющего определенную плотность ρ.
Построить траекторию полета снаряда Y(x) ,
указать максимальную высоту полета Hk , дальность падения снаряда Xk и время полета tk , построить график скорости V(t) на отрезке [0,tk].

Таким образом, исходные данные, которые пользователь может задать на форме:
Начальная скорость V0, м/с2
Начальная высота H0, м
Угол выстрела α, ° (град)
Плотность материала ρ, кг/м3
Радиус r, м

При построении математической модели условимся, что ось Оx системы координат направлена горизонтально в направлении выстрела, а ось Oy — вертикально вверх. Вектор скорости снаряда V(t) за время полета будет изменяться как по величине, так и по направлению, поэтому в модели рассматриваем его проекции на координатные оси. Горизонтальную составляющую скорости в момент времени t обозначим Vx(t), а вертикальную – Vy(t).

Пусть поверхность Земли плоская. Согласно законам механики, при сделанных предположениях движения тела в горизонтальном направлении является равномерным, а в вертикальном – равнозамедленным или равноускоренным с ускорением свободного падения g.

Если с силой тяжести FT все достаточно просто (она свой вектор не меняет ни по величине, ни по направлению), то сила лобового сопротивления FC , действующая на снаряд, пропорциональна квадрату скорости движения тела. Обозначим через FX и FY горизонтальную и вертикальную проекции вектора силы лобового сопротивления,
причем FX/F= VX/V, FY/F= VY/V.

Значение силы лобового сопротивления F= -b·V² (пропорционально квадрату скорости тела). Коэффициент b=0.5·C·S·ρ, где C – коэффициент лобового сопротивления (для многих задач баллистики C≈0.15), S – площадь поперечного сечения (S=πr²), ρ — плотность воздуха (ρ=1,29 кг/м3).

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

Метод Рунге-Кутта предполагает многократное вычисление значения производной искомой функции по имеющейся формуле (из уравнения), поэтому имеет смысл …

Код функций будет выглядеть так:

// функция Нахождение горизонтальной проекции скорости
//по первому уравнению системы
double Form1::fvx( double vy, double vx )
<
return -b*vx*sqrt(vx*vx+vy*vy) / m;
>

// функция Нахождение вертикальной проекции скорости
//по второму уравнению системы
double Form1::fvy( double vy, double vx )
<
return -b*vy*sqrt(vx*vx+vy*vy) / m — g;
>

Шаг интегрирования у меня задается на форме.
Сейчас нам предстоит вычислить значения нескольких функций (Vx, Vy, V ) в точках интервала с шагом. В моем примере у интервала задано начало х=0, а конечная точка интервала будет определена в процессе вычисления ( высота полета ядра стала Void Form1::Runge_Kutta(void)
<
double k1,k2,k3,k4, l1,l2,l3,l4;

pY[0]=H; pX[0]=0; pt[0]=0; //массивы-координаты: высота, дальность и время
pVx[0]=Vx; pVy[0]=Vy; pV[0]=V; //массивы- скорости: проекции на
//горизонталь и вертикаль и полная скорость (величина вектора)
bool vzbool=true;//взлет
int i=1;

//расчет по модели и заполнение массивов
while( (pY[i-1]>-0.00001 || vzbool) && i pY[i-1]) iMax=i; //сохранение номера узла с максимальной высотой
else vzbool=false;//падение

i++;
>
n=i-1; //количество реальных шагов
>

где:
int iMax; //узел с макс.высотой полета

double b; //коэф.пропорциональности Силы лобового сопротивления
double m; //масса ядра
double H; //уровень расположения орудия в момент выстрела
double V,Vx,Vy; //начальная скорость и ее проекции на оси

В результате работы этой подпрограммы произойдет численное решение задачи Коши для системы обыкновенных дифференциальных уравнений и будут получены значения функций Vx(ti), Vy(ti) в точках ti=i·h, i=1,2. ; h – шаг метода.

Как видим, после получения нового значения скорости Vx(ti)
рассчитывается координата X(ti)=X(ti-1)+h·Vx(ti), где h= ti-ti-1 = const.
Кроме того, параллельно рассчитывается значение высоты Y(ti)=Y(ti-1)+h·Vy(ti),
где h= ti-ti-1 = const по найденным значениям Vy(ti).
Когда будет получено значение Y(ti)

Примеры дифференциальных уравнений с решениями

  • Попробуйте решить приведенные ниже дифференциальные уравнения.
  • Нажмите на изображение уравнения, и вы попадете на страницу с подробным решением.

Примеры решений дифференциальных уравнений первого порядка

Примеры решений дифференциальных уравнений второго и высших порядков

Найти общее решение дифференциального уравнения, или решение с заданными начальными условиями.

Примеры решений линейных дифференциальных уравнений с постоянными коэффициентами

Примеры решений линейных уравнений в частных производных первого порядка

Найти общее решение линейного однородного уравнения в частных производных первого порядка и решить задачу Коши с указанным граничным условием:
,
при .

Найти поверхность, удовлетворяющую данному уравнению
,
и проходящую через данную окружность
, .

Автор: Олег Одинцов . Опубликовано: 28-01-2016 Изменено: 26-11-2021

Что такое дифференциальное уравнение и зачем оно нужно?

На сегодняшний день одним из важнейших навыков для любого специалиста является умение решать дифференциальные уравнения. Решение дифференциальных уравнений – без этого не обходится ни одна прикладная задача, будь это расчет какого-либо физического параметра или моделирование изменений в результате принятой макроэкономической политики. Эти уравнения также важны для ряда других наук, таких как химия, биология, медицина и т.д. Ниже мы приведем пример использования дифференциальных уравнений в экономике, но перед этим кратко расскажем об основных типах уравнений.

Дифференциальные уравнения – простейшие виды

Мудрецы говорили, что законы нашей вселенной написаны на математическом языке. Конечно, в алгебре есть много примеров различных уравнений, но это, большей частью, учебные примеры, неприменимые на практике. По-настоящему интересная математика начинается, когда мы хотим описать процессы, протекающие в реальной жизни. Но как отразить фактор времени, которому подчиняются реальные процессы – инфляция, выработка продукции или демографические показатели?

Вспомним одно важное определение из курса математики, касающееся производной функции. Производная является скоростью изменения функции, следовательно, она может помочь нам отразить фактор времени в уравнении.

То есть, мы составляем уравнение с функцией, которая описывает интересующий нас показатель и добавляем в уравнение производную этой функции. Это и есть дифференциальное уравнение. А теперь перейдем к простейшим типам дифференциальных уравнений для чайников.

Простейшее дифференциальное уравнение имеет вид $y’(x)=f(x)$, где $f(x)$ – некоторая функция, а $y’(x)$ – производная или скорость изменения искомой функции. Оно решается обычным интегрированием: $$y(x)=\int f(x)dx.$$

Второй простейший тип называется дифференциальным уравнением с разделяющимися переменными. Такое уравнение выглядит следующим образом $y’(x)=f(x)\cdot g(y)$. Видно, что зависимая переменная $y$ также входит в состав конструируемой функции. Уравнение решается очень просто – нужно «разделить переменные», то есть привести его к виду $y’(x)/g(y)=f(x)$ или $dy/g(y)=f(x)dx$. Остается проинтегрировать обе части $$\int \frac=\int f(x)dx$$ – это и есть решение дифференциального уравнения разделяющегося типа.

Последний простой тип – это линейное дифференциальное уравнение первого порядка. Оно имеет вид $y’+p(x)y=q(x)$. Здесь $p(x)$ и $q(x)$ – некоторые функции, а $y=y(x)$ – искомая функция. Для решения такого уравнения применяют уже специальные методы (метод Лагранжа вариации произвольной постоянной, метод подстановки Бернулли).

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

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

Пример применения дифференциального уравнения в экономике

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

Для некоторой фирмы функция маржинальной выручки от продажи своей продукции имеет вид $MR=10-0,2q$. Здесь $MR$ – маржинальная выручка фирмы, а $q$ – объем продукции. Нужно найти общую выручку.

Как видно из задачи, это прикладной пример из микроэкономики. Множество фирм и предприятий постоянно сталкивается с подобными расчетами в ходе своей деятельности.

Приступаем к решению. Как известно из микроэкономики, маржинальная выручка представляет собой производную от общей выручки, причем выручка равна нулю при нулевом уровне продаж.

С математической точки задача свелась к решению дифференциального уравнения $R’=10-0,2q$ при условии $R(0)=0$.

Проинтегрируем уравнение, взяв первообразную функцию от обеих частей, получим общее решение: $$R(q) = \int (10-0,2q)dq = 10 q-0,1q^2+C. $$

Чтобы найти константу $C$, вспомним условие $R(0)=0$. Подставим: $$R(0) =0-0+C = 0. $$ Значит C=0 и наша функция общей выручки принимает вид $R(q)=10q-0,1q^2$. Задача решена.

Другие примеры по разным типам ДУ собраны на странице: Дифференциальные уравнения с решениями онлайн.


источники:

http://1cov-edu.ru/differentsialnye-uravneniya/primery/

http://www.matburo.ru/mart_sub.php?p=art_du