Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчёт по контрольной работе.docx
Скачиваний:
16
Добавлен:
15.09.2019
Размер:
119 Кб
Скачать
☆

1.3. Улучшенный метод Эйлера

Первый улучшенный метод Эйлера применяется для расчета приближенного значения производной от решения в точке на середине расчетного интервала. Значение производной в середине получают применением явного метода Эйлера на половинном шаге по x. Улучшенный метод Эйлера имеет вид:

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

1.4. Метод Рунге-Кутты третьего порядка точности

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

Формально, методом Рунге-Кутты является модифицированный и исправленный метод Эйлера, они представляют собой схемы второго, третьего и четвертого порядка точности. Иногда при выполнении расчётов с повышенной точностью применяются схемы пятого и шестого порядков. Построение схем более высокого порядка сопряжено с большими вычислительными трудностями.

Метод Рунге-Кутты третьего порядка точности имеет вид:

Постановка задачи

2.1. Задача

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

  1. Найти приближенное решение задачи Коши для обыкновенных дифференциальных уравнений первого порядка

в точке с помощью метода Эйлера, .

  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;

}