ЛАБОРАТОРНАЯ РАБОТА РЕШЕНИЕ ЗАДАЧИ КОШИ МЕТОДОМ ЭЙЛЕРА
Автор: drug | Категория: Естественные науки / Физика | Просмотров: | Комментирии: 0 | 04-01-2013 19:02
ЛАБОРАТОРНАЯ РАБОТА № 1
РЕШЕНИЕ ЗАДАЧИ КОШИ МЕТОДОМ ЭЙЛЕРА
Любая задача проектирования, связанная с расчетом потоков энергии или движением тел, в конечном счете сводится к решению дифференциальных уравнений. Лишь очень немногие из них удается решить без помощи вычислительных машин. Поэтому численные методы решения дифференциальных уравнений играют такую важную роль в практике инженерных расчетов и в моделировании. В данной лабораторной работе изучается численное решение обыкновенных дифференциальных уравнений методом Эйлера.
Дифференциальное уравнение первого порядка можно записать в виде
y'=f(y,t) (1)
Это уравнение имеет семейство решений y(t). Например, если f(y,t)=y, то для произвольной константы C функция y(t)=C*et является решением.
Выбор начального значения, скажем y(0), служит для выделения одной кривой из семейства кривых.
Зачастую имеется более чем одно зависимое переменное, и тогда задача заключается в решении системы уравнений первого порядка, например:

y'=f(y,z,t)
z'=g(y,z,t) (2)
Решение этой системы содержит две постоянные интегрирования, и, следовательно, нужны два дополнительных условия, чтобы определить эти константы.
При обсуждении методов для задачи Коши удобно представлять себе единственное уравнение
y'=f(y,t)
c начальным условием y(t0)=y0. Однако методы с равным успехом применимы и к системам уравнений.
Метод Эйлера - это простейший метод решения задачи Коши, позволяющий интегрировать дифференциальные уравнения первого порядка. Его точность невелика, и поэтому на практике им пользуются сравнительно редко.
Метод Эйлера основан на разложении y в ряд Тейлора в окрестности t0:

y(t0+h)=y(t0)+h*y'(t0)+1/2*h2*y''(t0)+... (3)
Если h мало, то члены, содержащие h во второй или более высоких степенях, является малыми более высоких порядков и ими можно пренебрегать. Тогда


y(t0+h)=y(t0)+h*y'(t0). (4)
y'(t0) находим из дифференциального уравнения, подставим в него начальное условие. Таким образом, можно получить приближенное значение зависимой переменной при малом смещении h от начальной точки. Этот процесс можно продолжить, используя соотношение
yn+1=yn+hf(tn,yn) n=1,2,... (5)
и делая сколь угодно много шагов.
В модифицированном методе Эйлера сначала вычисляется значение функции в следующей точке по методу Эйлера:

y*n+1=yn+h*f(tn,yn) (6)

которое используется для вычисления приближенного значения производной в конце интервала f(tn+1,y*n+1). Вычислив среднее между этим значением производной и ее значением в начале интервала, найдем более точное значение yn+1:
yn+1=yn+1/2*h*[f(tn,yn)+f(tn+1,y*n+1)] (7)



Рисунок 1 – Графики решения методом Эйлера при положительном зна-чении h при N=25.




Рисунок 2 – Графики решения методом Эйлера при отрицательном зна-чении h при N=25.












Рисунок 3 – Графики решения методом Эйлера при отрицательном зна-чении h при N=250.














Рисунок 4 – Графики решения модифицированным методом Эйлера при отрицательном зна¬чении h при N=30




Рисунок 5 – Графики решения модифицированным методом Эйлера при отрицательном зна¬чении h при N=500




Рисунок 6 – Графики решения модифицированным методом Эйлера при положительном зна¬чении h при N=500





* EILER1
Программа решения систем дифференциальных уравнений
простым методом Эйлера.
ВХОДНЫЕ ДАННЫЕ:
N-число уравнений; h-шаг интегрирования; t-начальное
время; y[i]-массив начальных значений переменных
(i=0,1,2,...,N); функция вычисления правых частей
дифференциальных уравнений-f;
ВЫХОДНЫЕ ДАННЫЕ:
Результат после одного шага решения в массиве начальных
значений переменных y[i];текущее время-t.
ВНУТРЕННИЕ ПЕРЕМЕННЫЕ:
i,N-целочисленные переменные.
При использовании данной программы в качестве
вызываемой функции необходимо описать одномерные
массивы y,py размером N (все описания даются
с учётом нулевых значений индексов). Объявить типы
переменных t,h,y,i,N. */

/*Система дифференциальных уравнений:
px=-y;
py=x;
*/

#include
#include //библиотечные функции
#include
#include

void f(double t,double y[],double py[]);//прототип функции

main()

{

int v=20; //ширина поля печати
int w=9; //число знаков
int n=0; //номер шага интегрирования
const int N=2; //число дифференциальных ур-ий

double y[N]={16000,0}; //начальные условия

double py[N];
double t=0,h;
double dR=0; // Ошибка
double R=0; // Радиус
int i,k,m; //индексные переменные

const double pi=3.1415926535897932384626433832795; //число пи

h=-2*pi/60; //шаг интегрирования (+ или -)

R=y[0]; //радиус


//---------функции управления выводом данных-----
ofstream fout("1.txt");
cout.precision(w);
cout.setf(ios::left,ios::adjustfield);
fout<<setiosflags(ios::fixed);


//----------вывод на экран-----------------
cout<<"Programma C++ PROSTOI METOD EILERA "<<endl<<endl;

cout<<setw(v)<<"t"<<setw(v)<<"y0"<<setw(v)<<"y1"<<setw(v)<<"dR"<<endl;
cout<<setw(v)<<t<<setw(v)<<y[0]<<setw(v)<<y[1]<<setw(v)<<dR<<endl;

//----------вывод в текстовый файл----------
fout<<setw(v)<<t<<setw(v)<<y[0]<<setw(v)<<y[1]<<setw(v)<<dR<<endl;


for (k=0;k<20;k++) //количество точек на экране
{
for (m=0;m<30;m++)//число внутренних шагов интегрирования
{
n=n+1; //счетчик шагов

f(t,y,py);
for (i=0;i {

y[i]=y[i]+h*py[i]; //y=yn+h*f(tn,yn)

};

t=t+h; //t=tn+h
dR=fabs(R-sqrt(y[0]*y[0]+y[1]*y[1])); // Вычисление ошибки

//----------вывод в текстовый файл----------
fout<<setw(v)<<t<<setw(v)<<y[0]<<setw(v)<<y[1]<<setw(v)<<dR<<endl;

};

//----------вывод на экран-----------------
cout<<setw(v)<<t<<setw(v)<<y[0]<<setw(v)<<y[1]<<setw(v)<<dR<<endl;

};

fout.close();
return(0);
}

void f(double t,double y[],double py[]) //Функция вычисления
//правых частей ДУ
{
py[0]=-y[1]; // Знак из задания
py[1]=y[0];


}




При N=60







При N=600





/* EilerModif1
Программа решения систем дифференциальных уравнений
модифицированным методом Эйлера.
ВХОДНЫЕ ДАННЫЕ:
N-число уравнений; h-шаг интегрирования; t-начальное
время; y[i]-массив начальных значений переменных
(i=0,1,2,...,N); функция вычисления правых частей
дифференциальных уравнений-f;
ВЫХОДНЫЕ ДАННЫЕ:
Результат после одного шага решения в массиве начальных
значений переменных y[i];текущее время-t.
ВНУТРЕННИЕ ПЕРЕМЕННЫЕ:
py[i]-массив значений правых частей;
y0[i],y1[i]-масивы для хранения промежуточных
значений переменных; t0-время в начале шага;
i,N-целочисленные переменные.
При использовании данной программы в качестве
вызываемой функции необходимо описать одномерные
массивы y,y0,y1,py размером N (все описания даются
с учётом нулевых значений индексов). Объявить типы
переменных t,h,y,i,N. */

/*Система дифференциальных уравнений:
px=-y;
py=x;
*/
#include
#include //библиотечные функции
#include
#include

void f(double t,double y[],double py[]);//прототип функции

main()
{
int v=20; //ширина поля печати
int w=9; //число знаков
int n=0; //номер шага интегрирования
const int N=2; //число дифференциальных ур-ий

double y[N]={16000,0}; //начальные условия


double y0[N];
double y1[N];
double py[N];
double t0=0,t=0,h;
double dR=0; // Ошибка
double R=0; // Радиус
int i,k,m; //индексные переменные

const double pi=3.1415926535897932384626433832795; //число пи

h=-2*pi/60; //шаг интегрирования
R=y[0]; //радиус

//-------функции управления выводом данных-------
ofstream fout("1.txt");
cout.precision(w);
cout.setf(ios::left,ios::adjustfield);
fout<<setiosflags(ios::fixed);


//----------вывод на экран-----------------

cout<<"Programma C++ MODIF. METOD EILERA "<<endl<<endl;

cout<<setw(v)<<"t"<<setw(v)<<"y0"<<
setw(v)<<"y1"<<setw(v)<<"dR"<<endl;
cout<<setw(v)<<t<<setw(v)<<y[0]<<
setw(v)<<y[1]<<setw(v)<<dR<<endl;


//----------вывод в текстовый файл----------
fout<<setw(v)<<t<<setw(v)<<y[0]<<setw(v)<<y[1]<<setw(v)<<dR<<endl;

for (k=0;k<20;k++) //количество точек на экране
{
for (m=0;m<30;m++) //число внутренних шагов интегрирования
{
n=n+1; //счетчик шагов
for (i=0;i {
y0[i]=y[i];
};

/*------1-й цикл-------------*/

f(t,y,py);
for (i=0;i {

y[i]=y0[i]+h*py[i]; //y*=y0+h*f(tn,yn)
y1[i]=py[i]; //y1=f(tn,yn)
};

/*------2-й цикл--------------*/
t=t+h; //t=tn+h
f(t,y,py);
for (i=0;i {
y[i]=y0[i]+h/2*(y1[i]+py[i]); //y=yn+h/2*f(tn,yn)+
//f(tn+h,y*)
};

dR=fabs(R-sqrt(y[0]*y[0]+y[1]*y[1])); // Вычисление ошибки
//----------вывод в текстовый файл----------
fout<<setw(v)<<t<<setw(v)<<y[0]<<setw(v)<<y[1]<<setw(v)<<dR<<endl;

};

//----------вывод на экран-----------------
cout<<setw(v)<<t<<setw(v)<<y[0]<<setw(v)<<y[1]<<setw(v)<<dR<<endl;

};

fout.close();
return(0);
}

void f(double t,double y[],double py[]) //Функция вычисления
//правых частей ДУ
{
py[0]=-y[1];
py[1]=y[0];


}


При N=60





При N=600





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