- •Контрольная работа
- •Содержание
- •Введение
- •1.1. Задача Коши для обыкновенных дифференциальных уравнений 1-го порядка
- •1.2. Явный метод Эйлера
- •2.2. Требования
- •Алгоритм решения задачи
- •3.1. Исходный код функции: Подключение директив препроцессора и объявление функций
- •1.3. Улучшенный метод Эйлера
- •1.4. Метод Рунге-Кутты третьего порядка точности
- •Постановка задачи
- •2.1. Задача
- •3.6. Исходный код функции: главная функция main
- •Результат работы приложения
- •Заключение
1.3. Улучшенный метод Эйлера
Первый улучшенный метод Эйлера применяется для расчета приближенного значения производной от решения в точке на середине расчетного интервала. Значение производной в середине получают применением явного метода Эйлера на половинном шаге по x. Улучшенный метод Эйлера имеет вид:
Улучшенный метод Эйлера имеет второй порядок точности, однако для его реализации необходимо дважды вычислять правую часть функции.
1.4. Метод Рунге-Кутты третьего порядка точности
Методы Рунге-Кутты – важное семейство численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.
Формально, методом Рунге-Кутты является модифицированный и исправленный метод Эйлера, они представляют собой схемы второго, третьего и четвертого порядка точности. Иногда при выполнении расчётов с повышенной точностью применяются схемы пятого и шестого порядков. Построение схем более высокого порядка сопряжено с большими вычислительными трудностями.
Метод Рунге-Кутты третьего порядка точности имеет вид:
Постановка задачи
2.1. Задача
Разработать программу, реализующую численное решение задачи Коши для обыкновенных дифференциальных уравнений 1-го порядка.
Найти приближенное решение задачи Коши для обыкновенных дифференциальных уравнений первого порядка
в точке
с помощью метода Эйлера,
.
Получить уточненное решение с помощью формулы Рунге:
Использовать
разбиение отрезка
на
и
равных частей.
Получить численное решение задачи следующими методами (вариант шестнадцать):
f(x, y) |
X0 |
Y0 |
Xk |
Методы |
|
0 |
1 |
0,5 |
1. Улучшенный метод Эйлера. 2. Метод Рунге-Кутты 3 порядка.
|
2.2. Требования
Проектируемое приложение должно обеспечивать выполнение функций:
- Ввод исходных данных задачи
- Расчет приближенного решения заданными методами
- Вывод расчетных данных
Требования к эксплуатационным характеристикам:
- Модульность
- Расширяемость
Требования к программному обеспечению:
- среда разработки – MS Visual C++ версии не ниже 6.0
Алгоритм решения задачи
3.1. Исходный код функции: Подключение директив препроцессора и объявление функций
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
double Eilera(double x0, double y, double xn, double h1, int n1);
double Runge(double x0, double y, double xn, double h2, int n2);
double Runge_Kutte3(double x0, double y, double xn, double h1, int n1);
double Uluchshennii_metod_Eilera(double x0, double y, double xn, double h1, int n1);
double x0, y, xn, h1, n1, t, n2, h2, t1, t2, k1, k2, k3, t3, t4;
3.2. Исходный код функции «явный метод Эйлера»
double Eilera(double x0, double y, double xn, double h1, int n1)
{
int i;
double y1[100], s, x;
x=x0;
y1[0]=1;
for ( i=0; i<n1; i++){
y1[i+1]=y1[i]+h1*(pow(2.71,x)*sin(y1[i])+n1*x);
x+=h1;
cout<<"***********"<<y1[i+1];
cout<<"***********"<<x;
system("pause");
}
s=y1[i];
cout<<"***********"<<y1[i];
system("pause");
return s;
}
3.3. Исходный код функции «уточненное решение с помощью формулы Рунге»
double Runge(double x0, double y, double xn, double h2, int n2)
{
int i;
double y1[100], s, x;
x=x0;
y1[0]=1;
for ( i=0; i<n2; i++){
y1[i+1]=y1[i]+h2*(pow(2.71,x)*sin(y1[i])+n2*x);
x+=h2;
cout<<"**********"<<y1[i+1];
cout<<"**********"<<x;
system("pause");
}
s=y1[i];
cout<<"**********"<<y1[i];
system("pause");
return s;
}
3.4. Исходный код функции «улучшенный метод Эйлера»
double Uluchshennii_metod_Eilera(double x0, double y, double xn, double h1, int n1)
{
int i;
double y1[100], s, x, y2, x2;
x=x0;
y1[0]=1;
y2=y1[0]+(h1/2)*(pow(2.71,x0)*sin(y1[0])+n1*x0);
x2=x0+h1/2;
for ( i=0; i<2*n1; i++)
{
y1[i+1]=y1[0]+h1*((pow(2.71,x)+x2)*(sin(y1[i])+y2)+n1*x);
x+=h1;
cout<<"***********"<<y1[i+1];
3.5. Исходный код функции «метод Рунге-Кутты 3-го порядка»
double Runge_Kutte3(double x0, double y, double xn, double h1, int n1)
{
double k1;
double k2;
double k3;
int i;
double y1[100], s, x;
x=x0;
y1[0]=1;
for ( i=0; i<n1; i++){
k1=h1*(pow(2.71,x)*sin(y1[i])+n1*x);
k2=h1*((pow(2.71,x)+h1/2)*(sin(y1[i])+k1/2)+n1*x);
k3=h1*((pow(2.71,x)+h1)*(sin(y1[i])+2*k2-k1)+n1*x);
y1[i+1]=y1[i]+(k1+4*k2+k3)/6;
x+=h1;
cout<<"***********"<<y1[i+1];
cout<<"***********"<<x;
system("pause");
}
s=y1[i];
cout<<"***********"<<y1[i];
system("pause");
return s;
}
