Решение краевой задачи для обыкновенного дифференциального уравнения с заданной точностью

Описание метода сведения краевой задачи к задаче Коши. Решение системы из двух уравнений с четырьмя неизвестными. Метод Рунге-Кутта. Расчет максимальной погрешности и выполнение проверки точности. Метод конечных разностей. Описание полученных результатов.

Рубрика Математика
Вид курсовая работа
Язык русский
Дата добавления 10.07.2012
Размер файла 245,2 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

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

Дано линейное дифференциальное уравнение второго порядка:

(1.1)

с краевыми условиями:

(1.2)

где функции P(x), Q(x), F(x) непрерывны, и - заданные постоянные, причем: и .

Требуется найти решение y(x) уравнения (1.1), удовлетворяющее краевым условиям (1.2).

В данном варианте курсовой работы необходимо:

Решить краевую задачу для обыкновенного дифференциального уравнения с точностью Е=1.е-5. Проверить достигнутую точность. Результаты представить с шагом h=0.02. Решение провести тремя следующими методами:

1. Сведением краевой задачи к задаче Коши.

2. Методом конечных разностей.

3. Методом Галёркина.

(1.3)

Из условий следует, что функции P(x) = 0.9x; Q(x) =2.3/x ; F(x) =1.8/(x*x)-4 и постоянные 1 = 1, 2 = 0, 1 = 1, 2 = 0, a =1.3, b =1.8, A = 2.2, B = -1.4.

2. Метод сведения краевой задачи к задаче Коши

2.1 Описание метода

Решение дифференциального уравнения (1.1) с краевыми условиями (1.2) будем искать в виде линейной комбинации:

где c=const (2.1)

Подставим y(x) в виде (2.1) в исходное дифференциальное уравнение (1.1) и сгруппируем слагаемые при постоянной с, получим выражение:

(2.2)

Потребуем, чтобы равенство (2.2) выполнялось при любом с, для этого необходимо, чтобы коэффициенты при постоянной с обращались в ноль, получим систему уравнений:

(2.3)

Из системы дифференциальных уравнений (2.3) видно, что функция u=u(x) - ненулевое решение соответствующего однородного уравнения, а v=v(x) - некоторое решение данного неоднородного уравнения (1.1).

Чтобы свести краевую задачу (1.1)-(1.2) к задачам Коши для функций u=u(x) и v=v(x), подставим в первое краевое условие (1.2) выражение для функции y(x) и сгруппируем слагаемые при постоянной c, будем иметь:

(2.4)

Для того чтобы равенство (2.4) было справедливо при любом с, необходимо и достаточно, чтобы коэффициенты при постоянной с обращались в ноль, т. е. должны быть выполнены равенства:

(2.5)

Получили систему (2.5) из двух уравнений с четырьмя неизвестными. Решений системы будет бесконечное множество. Найдем хотя бы одно.

Для обеспечения первого равенства системы, например, можно подобрать:

(2.6)

где постоянная k отлична от нуля, так как тривиальное решение u(a)=0 можно отбросить.

Для выполнения второго равенства системы (2.5) можно положить

(2.7)

или

при (2.8)

По условию курсовой работы 1 = 1, 2 = 0, A = -2 будем иметь:

(2.9)

(2.10)

Отсюда видно, что u есть решение задачи Коши (2.9) для однородного уравнения (2.3), удовлетворяющее начальным условиям (2.6), а v есть решение задачи Коши (2.10) для неоднородного уравнения (2.3), удовлетворяющее начальным условиям (2.7) или (2.8). При этом для любого с функция y = cu + v удовлетворяет краевому условию на конце x=a.

Подберем теперь постоянную c так, чтобы функция y(x) удовлетворяла краевому условию (1.2) на конце x=b. Это дает:

откуда:

,

при этом предполагается, что знаменатель

Так как по условию работы 1 = 1, 2 = 0, то коэффициент c будет иметь вид:

Для решения полученных уравнений из системы (2.3) будем использовать метод Рунге-Кутта, который имеет достаточно высокую точность на всем интервале порядка

Рассмотрим второе дифференциальное уравнение из системы (2.3) с начальным условием (2.7). Дифференциальные уравнения системы (2.3) являются однотипными, поэтому решение первого уравнения системы (2.3) с начальным условием (2.6) осуществляется аналогичным способом, при условии .

Для того чтобы решить указанное дифференциальное уравнение методом Рунге-Кутта, сделаем замену:

и подставим ее во второе дифференциальное уравнение из системы (2.3), получим:

,

Расчет производим следующим образом: выберем шаг h, приращение x в зависимости от шага будет:

где n=0,1…k-1

Соответствующие значения и искомых функций v и z определяются формулами:

где:

Чтобы достичь заданную точность вычисляем y(x) двумя способами: один раз с шагом h, другой раз с шагом h/2, получая при этом значения более точные. Если расхождение полученных значений не превышает заданной точности Е =, то выбранный шаг h можно считать достаточным и полученная функция y(x) удовлетворяет заданной точности. Иначе уменьшаем шаг h, пока не будет достигнута заданная точность.

2.2 Описание результатов

При решении данного дифференциального уравнения второго порядка с заданными краевыми условиями (1.3) методом сведения к задаче Коши и последующим её решением методом Рунге-Кутта, были получены следующие результаты, представленные в таблице 1. В столбце Х приведено разбиение отрезка [1.3; 1.8] с шагом h = 0.02, в столбце Y(X) - значение функции (n=1,…,26) в соответствующих точках , в столбце E - значения найденных абсолютных погрешностей.

В результате работы программы, листинг которой приведен в приложении 1, точность была достигнута при шаге 0.01, максимальная погрешность равна как видно из таблицы 1 при n=9.

Точность решений определялась из условия, что норма модуля разности более точного решения и приближенного должна быть меньше заданной точности. Для достижения заданной точности E = шаг h = 0.02 уменьшили в 2 раза, так как при шаге h = 0.02 полученная точность не удовлетворяла заданной.

Легко заметить, что полученная максимальная погрешность меньше заданной точности, следовательно, проверка точности выполнена и полученная точность удовлетворяет заданной.

Таблица 1

X Y(X) E

1) 1.30 2.200000 0.00e+000

2) 1.32 2.029192 4.53e-010

3) 1.34 1.859824 8.27e-010

4) 1.36 1.692046 1.13e-009

5) 1.38 1.525999 1.36e-009

6) 1.40 1.361814 1.53e-009

7) 1.42 1.199613 1.65e-009

8) 1.44 1.039511 1.72e-009

9) 1.46 0.881613 1.75e-009

10) 1.48 0.726016 1.74e-009

11) 1.50 0.572810 1.70e-009

12) 1.52 0.422075 1.63e-009

13) 1.54 0.273886 1.54e-009

14) 1.56 0.128307 1.42e-009

15) 1.58 -0.014601 1.30e-009

16) 1.60 -0.154787 1.17e-009

17) 1.62 -0.292205 1.03e-009

18) 1.64 -0.426817 8.85e-010

19) 1.66 -0.558591 7.44e-010

20) 1.68 -0.687500 6.07e-010

21) 1.70 -0.813522 4.77e-010

22) 1.72 -0.936644 3.55e-010

23) 1.74 -1.056855 2.45e-010

24) 1.76 -1.174151 1.48e-010

25) 1.78 -1.288531 6.56e-011

26) 1.80 -1.400000 4.44e-016

3. Метод конечных разностей

3.1 Описание метода

Решим дифференциальное уравнение (1.1) с краевыми условиями (1.2) методом конечных разностей. Для того чтобы получить систему конечно-разностных уравнений, разобьем отрезок [a,b] на n равных частей длины как показано на рисунке 1. Точки разбиения имеют абсциссы:

(i=0,1,2,…,n), .

Рис. 1

Значения в точках искомой функции y=y(x) и ее производных обозначим соответственно:

Введем также обозначения:

.

Заменяя производные симметричными конечно-разностными отношениями для внутренних точек отрезка [a, b] будем иметь:

(i=1,2,…,n-1) (3.1)

где - погрешность формулы порядка .

Подставим конечно-разностные выражения (3.1) в исходное дифференциальное уравнение (1.1). В результате подстановки получим:

(3.2)

Или запишем выражение (3.2) в виде:

, (i=1,2,...,n-1), (3.3)

Так как всего n+1 неизвестных на отрезке [a, b], а уравнений n-1, то не хватает еще двух уравнений для нахождения всех (i=0,1,…,n). Эти недостающие уравнения дают краевые условия (1.2). По условию курсовой работы , , поэтому система (1.2) принимает вид:

С учетом этого запишем систему линейных алгебраических уравнений:

,

где (i=1,2,...,n-1) (3.4)

Таким образом, получена линейная система (3.4) из n+1 уравнений с n+1 неизвестными , представляющими собой значения искомой функции y=y(x) в точках .

Систему уравнений (3.4) можно записать в матричном виде, при этом получается трехдиагональная матрица коэффициентов

Вычислить решение системы можно методом алгебраической прогонки. Метод прогонки состоит из двух частей: прямой и обратный ход.

Приведем матрицу (3.5) к двухдиагональному виду. Предположим, что из (3.4) исключена неизвестная . Тогда это уравнение примет вид:

(3.7)

где (i=1,2,...,n-1) некоторые коэффициенты.

В прямом ходе метода прогонки определяются коэффициенты зная Найдем эти коэффициенты, для этого запишем

Подставим это выражение в (3.4) и, выразив , будем иметь:

(3.8)

Сравнивая формулы (3.7) и (3.8), получим рекуррентные формулы для определения и :

(i=1,2,...,n-1) (3.9)

Определим теперь и . Из (3.7) при i=0 получим:

(3.10)

Сравнивая (3.10) и первое краевое условие из (1.2), находим:

При обратном ходе, используя формулу (3.7) и условие , последовательно находим

Точность в методе конечных разностей достигается аналогичным способом, приведенным в методе сведения краевой задачи к задаче Коши, так как полученная точность зависит от шага разбиения отрезка [a, b].

3.2 Описание результатов

При решении данного дифференциального уравнения второго порядка с заданными краевыми условиями (1.3) методом конечных разностей, получены следующие результаты представленные в таблице 2. В столбце Х приведено разбиение отрезка [1.3; 1.8] с шагом h = 0.02, в столбце Y(X) - значение функции (n=1,…,26) в соответствующих точках , в столбце E - значения найденных абсолютных погрешностей.

В результате работы программы, листинг которой приведен в приложении 2, точность была достигнута при шаге 0.01, максимальная погрешность как видно из таблицы 2 при n=14.

Для достижения заданной точности Е = шаг h = 0.02 уменьшили в 2 раза, поскольку при шаге большем, чем h = 0.01 полученная точность не удовлетворяла заданной.

Легко заметить, что полученная максимальная погрешность меньше заданной точности, следовательно, проверка точности выполнена и полученная точность удовлетворяет заданной.

Таблица 2

X Y(X) E

1) 1.30 2.200000 0.00e+000

2) 1.32 2.029191 6.88e-007

3) 1.34 1.859823 1.33e-006

4) 1.36 1.692044 1.92e-006

5) 1.38 1.525996 2.45e-006

6) 1.40 1.361810 2.94e-006

7) 1.42 1.199608 3.36e-006

8) 1.44 1.039506 3.73e-006

9) 1.46 0.881607 4.04e-006

10) 1.48 0.726010 4.29e-006

11) 1.50 0.572804 4.48e-006

12) 1.52 0.422069 4.61e-006

13) 1.54 0.273879 4.68e-006

14) 1.56 0.128301 4.69e-006

15) 1.58 -0.014607 4.62e-006

16) 1.60 -0.154793 4.50e-006

17) 1.62 -0.292211 4.32e-006

18) 1.64 -0.426823 4.07e-006

19) 1.66 -0.558596 3.77e-006

20) 1.68 -0.687504 3.40e-006

21) 1.70 -0.813526 2.98e-006

22) 1.72 -0.936648 2.50e-006

23) 1.74 -1.056858 1.95e-006

24) 1.76 -1.174153 1.36e-006

25) 1.78 -1.288532 7.06e-007

26) 1.80 -1.400000 0.00e+000

4. Метод Галёркина

4.1 Описание метода

В данном методе решения дифференциального уравнения (1.1) с краевыми условиями (1.2) для удобства описания метода введем:

линейный дифференциальный оператор

,

линейные операторы

Тогда постановка задачи для дифференциального уравнения (1.1) с краевыми условиями (1.2) примет вид:

(4.1)

Решение краевой задачи (4.1) будем искать в виде суммы:

(4.2)

где ( i = 1, 2,..., n ) - конечная система базисных функций. Базисные функции должны составлять часть полного класса функций, то есть нет ни одной функции, которую нельзя было бы разложить по данной системе базисных функций.

Функция y(x) должна удовлетворять краевым условиям, то есть должно выполняться:

Краевые условия должны быть справедливы для любого набора констант , поэтому запишем:

По условию курсовой работы получим:

(4.3)

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

В качестве базисных функций выбираем:

При таком подборе базисных функций функция y(x), удовлетворяет краевым условиям, при любом наборе констант .

Введем следующее определение: невязка - разность между левой и правой частями уравнения:

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

Таким образом, для определения коэффициентов (i=1,2,...,n) приходим к системе линейных уравнений:

, (i=1,2,...,n)

или более подробно запишем данную систему в матричном виде:

= (4.4)

Система уравнений (4.4) разрешается относительно по методу Гаусса. По полученным значениям и функциям определяем столбец значений функции y(x) согласно формуле (4.2).

Определенные интегралы системы уравнений (4.4) можно вычислить по методу Симпсона, общая формула которого имеет вид:

где n - количество разбиений отрезка [a, b].

Общая погрешность метода Симпсона составляет где .

Подынтегральные функции в системе (4.4) имеют видили Тогда из однородных краевых условий (4.3) получим или , что упрощает формулу Симпсона.

Чтобы достичь заданную точность вычисляем y(x) двумя способами: один раз с числом базисных функций i, другой раз с i+1, получая при этом значения более точные. Если расхождение полученных значений не превышает заданной точности Е = то выбранное число функций можно считать достаточным и полученная функция y(x) удовлетворяет заданной точности. Иначе увеличиваем i, пока не будет достигнута заданная точность.

4.2 Описание результатов

При решении данного дифференциального уравнения второго порядка с заданными краевыми условиями (1.3) методом Галёркина, получены следующие результаты представленные в таблице 3. В столбце Х приведено разбиение отрезка [1.3; 1.8] с шагом h = 0.02, в столбце Y(X) - значение функции (n=1,…,26) в соответствующих точках в столбце E - значения найденных абсолютных погрешностей.

В результате работы программы, листинг которой приведен в приложении 3, точность была достигнута при количестве базисных функций равных 5, максимальная погрешность как видно из таблицы 3 при n=24.

Легко заметить, что полученная максимальная погрешность меньше заданной точности следовательно, проверка точности выполнена и полученная точность удовлетворяет заданной.

коши краевой задача точность

Таблица 3

X Y(X) E

1) 1.30 2.200000 0.00e+000

2) 1.32 2.029193 8.78e-007

3) 1.34 1.859826 9.65e-007

4) 1.36 1.692047 6.87e-007

5) 1.38 1.526000 3.23e-007

6) 1.40 1.361814 3.49e-008

7) 1.42 1.199613 1.03e-007

8) 1.44 1.039511 8.21e-008

9) 1.46 0.881613 6.72e-008

10) 1.48 0.726016 2.90e-007

11) 1.50 0.572810 5.25e-007

12) 1.52 0.422076 7.15e-007

13) 1.54 0.273886 8.18e-007

14) 1.56 0.128308 8.13e-007

15) 1.58 -0.014600 7.01e-007

16) 1.60 -0.154786 5.07e-007

17) 1.62 -0.292205 2.77e-007

18) 1.64 -0.426817 6.75e-008

19) 1.66 -0.558591 5.80e-008

20) 1.68 -0.687500 4.71e-008

21) 1.70 -0.813523 1.28e-007

22) 1.72 -0.936644 4.51e-007

23) 1.74 -1.056855 8.38e-007

24) 1.76 -1.174150 1.11e-006

25) 1.78 -1.288530 9.85e-007

26) 1.80 -1.400000 0.00e+000

Выводы

Обыкновенное дифференциальное уравнение второго порядка было решено тремя методами: сведением краевой задачи к задаче Коши, методом конечных разностей, методом Галёркина. Для получения решения были написаны программы на языке программирования C++.

Максимальная погрешность в методе сведения краевой задачи к задаче Коши равна , в методе конечных разностей: , в методе Галёркина: .

Требуемая точность E=была достигнута. При использовании методов сведения к задаче Коши и конечных разностей точность достигалась путём уменьшения шага, при использовании метода Галёркина - путём увеличения количества базисных функций.

Приложение 1

Листинг программы «Метод сведения краевой задачи к задаче Коши»

#include "stdafx.h"

#include "math.h"

const int N_max=100;

const double a=1.3, b=1.8, A=2.2, B=-1.4, epsel=0.00001;

double F(double x)

{ return (1.8/(x*x)-4);}

double Q(double x)

{ return (2.3/x);}

double P(double x)

{ return (0.9*x);}

void Runge_Kutt(double h,int n,double U[],double V[],double z[],double t[],double a)

{

double k1z,k2z,k3z,k4z,

k1v,k2v,k3v,k4v,

k1t,k2t,k3t,k4t,

k1u,k2u,k3u,k4u;

double x=a;

z[0]=0;

V[0]=A;

t[0]=1;

U[0]=0;

for(int i=0;i<=n;i++){

x=a+i*h;

k1v=z[i];

k1z=F(x) - P(x)*z[i]-Q(x)*V[i];

k2v=z[i]+h/2*k1z;

k2z=F(x+h/2) - P(x+h/2)*(z[i]+h/2*k1z)-Q(x+h/2)*(V[i]+h/2*k1v);

k3v=z[i]+h/2*k2z;

k3z=F(x+h/2) - P(x+h/2)*(z[i]+h/2*k2z)-Q(x+h/2)*(V[i]+h/2*k2v);

k4v=z[i]+h*k3z;

k4z=F(x+h) - P(x+h)*(z[i]+h*k3z)-Q(x+h)*(V[i]+h*k3v);

k1u=t[i];

k1t=-P(x)*t[i]-Q(x)*U[i];

k2u=t[i]+h/2*k1t;

k2t=-P(x+h/2)*(t[i]+h/2*k1t)-Q(x+h/2)*(U[i]+h/2*k1u);

k3u=t[i]+h/2*k2t;

k3t=-P(x+h/2)*(t[i]+h/2*k2t)-Q(x+h/2)*(U[i]+h/2*k2u);

k4u=t[i]+h*k3t;

k4t=-P(x+h)*(t[i]+h*k3t)-Q(x+h)*(U[i]+h*k3u);

V[i+1]=V[i]+h/6*(k1v+2*k2v+2*k3v+k4v);

z[i+1]=z[i]+h/6*(k1z+2*k2z+2*k3z+k4z);

U[i+1]=U[i]+h/6*(k1u+2*k2u+2*k3u+k4u);

t[i+1]=t[i]+h/6*(k1t+2*k2t+2*k3t+k4t);

}

}

double Proverka_Tochnosti(double y[],double y_tochnoe[],int n,double delta,double eps[])

{

int i=0;

delta=0;

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

{

eps[i]=fabs(y[2*i]-y_tochnoe[i]);

if(eps[i]>delta)

delta=eps[i]; }

return delta;}

void Nahozdenie_y(double y[],double U[],double V[],int n,double C)

{

int i;

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

y[i]=C*U[i]+V[i];

}

void Prisvoenie_y_Tochnoe(double y[],double y_tochnoe[],double y_vivodimoe[],int n)

{

int i;

for(i=0;i<=n;i++){

y_vivodimoe[i]=y_tochnoe[i];

y_tochnoe[i] = y[i];}

}

void Pechat(double y_vivodimoe[],double a,double eps[],int n,int N,double delta)

{

int i,j=1,k;

double h,x=a;

k=n/N;

h=(b-a)/n;

printf("n = %d\nh = %1.2f\nMax_Delta = %1.2e\n\n",n,h,delta);

printf("\tx\ty\t\tE\n");

for(i=0;i<=n;i+=k)

{

printf("%d)\t%1.2f\t%f\t%1.2e\n",j++,x,y_vivodimoe[i],eps[i]);

x=x+k*h;

}

}

main()

{

int i=0,j=0,N=25,n=0;

double U[N_max],V[N_max],z[N_max],y[N_max],y_tochnoe[N_max],y_vivodimoe[N_max];

double h=0,x=0,delta=0,t[N_max],eps[N_max],C=0;

n=N;

do

{

if(n>=N_max)

{

printf("Vihod za predeli massiva");

return 0;

}

h=(b-a)/n;

Runge_Kutt(h,n,U,V,z,t,a);

C=(B-V[n])/U[n];

Nahozdenie_y(y,U,V,n,C);

delta=Proverka_Tochnosti(y,y_tochnoe,n,delta,eps);

Prisvoenie_y_Tochnoe(y,y_tochnoe,y_vivodimoe,n);

n=2*n;

}

while(delta>epsel);

Pechat(y_vivodimoe,a,eps,n/4,N,delta);

printf("n = %d\nh = %1.2f\nMax_Delta = %1.2e\n\n",n,h,delta);

return 0;}

Приложение 2.

Листинг программы «Метод конечных разностей»

#include "stdafx.h"

#include "math.h"

const int N_max=200;

const double epsel=0.00001;

const double a=1.3, b=1.8, A=2.2, B=-1.4;

double F(double x)

{ return 1.8/(x*x)-4;}

double Q(double x)

{ return 2.3/x;}

double P(double x)

{ return 0.9*x;}

void Metod_K_R(double y[],double h,int n )

{int i;

double x,m,k,f;

static double c[N_max],d[N_max];

c[0]=0;

d[0]=A;

for( i=1;i<n;i++)

{

x=a+i*h;

m=(Q(x) - 2/(h*h)) / (1/(h*h) + P(x)/(2*h));

k= (1/(h*h) - P(x)/(2*h)) / (1/(h*h) + P(x)/(2*h));

f=F(x) / (1/(h*h) + P(x)/(2*h));

c[i]=1/(m-k*c[i-1]);

d[i]=c[i]*(f-k*d[i-1]);

}

y[n]=B;

for(i=n-1;i>=0;i--)

y[i]=d[i]-c[i]*y[i+1];

}

double Prov_toch(double y[],double y_tochnoe[],int n,double delta,double eps[])

{

int i;

delta=0;

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

{

eps[i]=fabs(y[2*i]-y_tochnoe[i]);

if(eps[i]>delta)

delta=eps[i];

}

return delta;

}

void Pechat(double y_vivodimoe[],double a,double eps[],int n,int N,double delta)

{

int i,j=1,k;

double h,x=a;

k=n/N;

h=(b-a)/n;

printf("n = %d\nh = %1.2f\nMax_Delta = %1.2e\n\n",n,h,delta);

printf("\tx\ty\t\tE\n");

for(i=0;i<=n;i+=k)

{

printf("%d)\t%1.2f\t%f\t%1.2e\n",j++,x,y_vivodimoe[i],eps[i]);

x=x+k*h;

}

}

main()

{

int i,N=25,n;

double y[N_max],y_tochnoe[N_max],eps[N_max],y_vivodimoe[N_max];

double h,delta;

n=N;

do

{

if(n>=N_max)

{

printf("Vihod za predeli masiva ");

return 0;

}

h=(b-a)/n;

Metod_K_R(y,h,n);

delta=Prov_toch(y,y_tochnoe,n,delta,eps);

for(i=0;i<=n;i++){

y_vivodimoe[i]=y_tochnoe[i];

y_tochnoe[i] = y[i];}

n=2*n;

}

while(delta>epsel);

Pechat(y_vivodimoe,a,eps,n/4,N,delta);

printf("n = %d\nh = %1.2f\nMax_Delta = %1.2e\n\n",n,h,delta);

return 0;}

Приложение 2

Листинг программы «Метод Галёркина»

#include "stdafx.h"

#include "math.h"

#include "process.h"

const double epsel=0.00001;

const double h=0.02;

const double a=1.3;

const double b=1.8;

const double A=2.2;

const double B=-1.4;

const int M=10, N_max=26, E=8;

double F(double x)

{ return 1.8/(x*x)-4;}

double Q(double x)

{ return 2.3/x;}

double P(double x)

{ return 0.9*x;}

void Resheniya(double D[],double C[],int n)

{

double U,L,matrix[N_max][N_max];

double x,sum1,sum2,h=(b-a)/E,koef;

int k,i,j,t;

for(k=1;k<=n;k++){

for(i=1;i<=n;i++)

{sum1=0;sum2=0;

for(j=1;j<E;j++)

{

x=a+j*h;

U=pow(x-a,i)*(x-b);

L=k*pow(x-a,k-2)*((k-1)*(x-b)+2*(x-a))+P(x)*(k*pow(x-a,k-1)*(x-b)+pow(x-a,k))+Q(x)*pow(x-a,k)*(x-b);

if(j%2) sum1+=U*L;

else sum2+=U*L;

}

matrix[i-1][k-1]=h/3*(4*sum1+2*sum2);

}

}

for(i=1;i<=n;i++)

{sum1=0;sum2=0;

for(j=1;j<E;j++)

{

x=a+j*h;

U=pow(x-a,i)*(x-b);

L=P(x)*(B-A)/(b-a)+Q(x)*((A*b-B*a)/(b-a)+(B-A)/(b-a)*x);

if(j%2) sum1+=U*(F(x)-L);

else sum2+=U*(F(x)-L);

}

D[i-1]=h/3*(4*sum1+2*sum2);

}

// Metod Gausa

for(t=0;t<n-1;t++)

{

for( i=t+1;i<n;i++){

koef=matrix[i][t]/matrix[t][t];

D[i]=D[i]-D[t]*koef;

for( j=t+1;j<n;j++){

matrix[i][j]=matrix[i][j]-matrix[t][j]*koef;

}

}

}

for(i=n-1;i>=0;i--){

C[i]=D[i];

for(j=i+1;j<n;j++)

{C[i]=C[i]- matrix[i][j]*C[j];}

C[i]=C[i]/matrix[i][i];}

}

void Nahozdenie_y(double y[],double C[],int n)

{

int i,j;

double x,m=(A*b-B*a)/(b-a),g=(B-A)/(b-a);

for(j=0;j<N_max;j++){

x=a+j*h;

y[j]=m+g*x;

for(i=1;i<=n;i++)

{y[j]+=C[i-1]*pow(x-a,i)*(x-b);}

}

}

double Proverka(double y[],double y_tekushee[],int n,double eps[])

{

int i;

double delta;

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

{eps[i]=fabs(y[i]-y_tekushee[i]);

if(eps[i]>delta)delta=eps[i]; }

return delta;

}

void Prisvoenie_y_tekushee(double y[],double y_tekushee[],double y_vivodimoe[],int n)

{

int i;

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

{y_vivodimoe[i]=y_tekushee[i];

y_tekushee[i] = y[i];}

}

void Pechat_rez(double y_vivodimoe[],double eps[], int n,double delta)

{ int i;

double x;

printf("Bazis = %d\n",n);

printf("Razbienij v metode Simpsona = %d \n",E);

printf("Max_Delta = %1.2e\n\n",delta);

printf("\t X\t Y(X)\t\t Delta\n");

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

{

x=a+i*h;

printf("\t %1.2f \t %lf \t %1.2e\n",x,y_vivodimoe[i],eps[i]);

}

}

main()

{

int n=0;

double y[N_max],y_tekushee[N_max],y_vivodimoe[N_max],eps[N_max],B[N_max],C[N_max];

double delta;

do

{

n++;

if(n>=M)

{

printf("Error!!! Vihod za predeli\n\n");

return 0;

}

Resheniya(B,C,n);

Nahozdenie_y(y,C,n);

delta=Proverka(y,y_tekushee,n,eps);

Prisvoenie_y_tekushee(y,y_tekushee,y_vivodimoe,n);

}while(delta>epsel);

Pechat_rez(y_vivodimoe,eps,n,delta);

return 0;

}

Размещено на Allbest.ru


Подобные документы

  • Последовательность решения линейной краевой задачи. Особенности метода прогонки. Алгоритм метода конечных разностей: построение сетки в заданной области, замена дифференциального оператора. Решение СЛАУ методом Гаусса, конечно-разностные уравнения.

    контрольная работа [366,5 K], добавлен 28.07.2013

  • Сущность методов сведения краевой задачи к задаче Коши и алгоритмы их реализации на ПЭВМ. Применение метода стрельбы (пристрелки) для линейной краевой задачи, определение погрешности вычислений. Решение уравнения сшивания для нелинейной краевой задачи.

    методичка [335,0 K], добавлен 02.03.2010

  • Порядок и принципы составления дифференциального уравнения, методика нахождения неизвестных значений. Замена исходного дифференциального уравнения на систему n-линейных уравнений относительно n-неизвестных. Формирование и решение системы уравнений.

    задача [118,8 K], добавлен 20.09.2013

  • Решение линейной краевой задачи методом конечных разностей (методом сеток). Замена области непрерывного изменения аргументов дискретным множеством узлов (сеток). Сведение линейной краевой задачи к системе линейных алгебраических уравнений (сеточных).

    лекция [463,7 K], добавлен 28.06.2009

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

    контрольная работа [177,1 K], добавлен 13.06.2012

  • Метод разделения переменных в задаче Штурма-Лиувилля. Единственность решения смешанной краевой задачи, реализуемая методом априорных оценок. Постановка и решение смешанной краевой задачи для нелокального волнового уравнения с дробной производной.

    курсовая работа [1003,8 K], добавлен 29.11.2014

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

    лабораторная работа [23,3 K], добавлен 15.11.2010

  • Основные методы Рунге-Кутта: построение класса расчетных формул. Расчетная формула метода Эйлера. Получение различных методов Рунге-Кутта с погрешностью второго порядка малости при произвольном задавании параметров. Особенности повышения порядка точности.

    реферат [78,4 K], добавлен 18.04.2015

  • Теоретическое обоснование расчетных формул. Задача Коши для дифференциального уравнения первого порядка. Метод Рунге-Кутта. Ломаная Эйлера. Построение схем различного порядка точности. Выбор шага. Апостериорная оценка погрешности. Правило Рунге.

    курсовая работа [111,1 K], добавлен 13.11.2011

  • Численное решение уравнения методом Эйлера и Рунге-Кутта в Excel. Программа на языке Turbo Pascal. Блок-схема алгоритма. Метод Рунге-Кутта для дифференциального уравнения второго порядка. Модель типа "хищник-жертва" с учетом внутривидового взаимодействия.

    курсовая работа [391,5 K], добавлен 01.03.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.