Смекни!
smekni.com

Решение прикладных задач численными методами (стр. 2 из 2)


Часть 2

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

Вариант №21.

Задание на выполнения второй части курсовой работы:

Дифференциальное уравнение:

Точное решение уравнения:

Начальные условия:x0 = 0 , y0 =0, xmax=2.

Метод решения: метод Эйлера-Коши, Δx = 0,01; 0,005; 0,001.

Метод Эйлера-Коши

Метод Эйлера-Коши (или усовершенствованный метод Эйлера) является методом второго порядка и заключается в следующем. Интегральная кривая на каждом шаге интегрирования заменяется прямой с тангенсом угла наклона, равным среднему арифметическому тангенсов углов наклона касательных к искомой функции в начале и в конце шага. Вычисления проводятся в следующем порядке:

1. Выбираем шаг интегрирования

.

2. Полагаем номер шага

.

3. Вычисляем

, находим оценку для приращения функции на этом шаге методом Эйлера
,
, вычисляем среднее арифметическое тангенсов углов наклона
и окончательно получаем:

.

4. Если

, то увеличиваем номер шага
на единицу и повторяем п.3. В противном случае переходим к выполнению п.5.

5. Оформляем полученный результат.

Достоинство метода – более высокая точность вычисления по сравнению с методом Эйлера. Недостаток – больший объем вычислений правых частей.

Таблицаидентификаторов:

Обозначение Идентификатор Тип
s s int
i i int
x x float
xmax x_max float
x1 x1 float
Δx
h[i] float
y y float
d d float
f(x) f(x) float
k k(x,y) float
K1 f1 float
K2 f2 float
K3 f3 float
K4 f4 float

Схемаалгоритма:


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

#include<stdio.h>

#include<math.h>

int s,i;

double x, x1, x_max=2, y, d, q;

double h[3]={0.01,0.005,0.001};

double k(double x,double y )

{

return ((x)/(4+(pow(x,4))));

}

double e(double x)

{

return 0.25*atan(pow(x,2)/2);

}

double f1=k(x,y);

double yw=y+f1*h[i];

double r=x+h[i];

double fl=k(r,yw);

int main(void)

{

FILE*sev;

sev=fopen("E:result34.xls","w+");

for (i=0;i<=2;i++)

{

s=0; y=0;

fprintf(sev,"h(%i)=%lf&bsol;n",i,h[i]);

for(x=0;x<=x_max;x+=h[i])

{

s++;

x1=x+h[i];

y+=(f1+fl)*h[i]/2;

d=y-e(x1);// y- pribl. f(x)- tochnoe

printf(" step =%4.i x=%6.4lf &bsol;ty=%6.4lf yt=%6.4lf d=%10.8f&bsol;n",s,x1,y,e(x1),d);

fprintf(sev," &bsol;t step =&bsol;t%4.i&bsol;t x=&bsol;t%10.5lf&bsol;t y=&bsol;t%10.5lf&bsol;t yt=&bsol;t%10.5lf&bsol;t d=&bsol;t%10.5f&bsol;n",s,x1,y,e(x1),d);

}

}

fclose(sev);

return 0;

}

Вывод:

Интегрированная среда Visual С позволяет обрабатывать программы, записанные на языке С++ . Для программирования циклических алгоритмов были использованы операторы организации циклов с параметрами, решение использует форматируемый вывод и оператор присваивания, а также использовались операторы вызова функций. Чем больше шаг, тем точнее вычисления.