Решение краевой задачи для обыкновенного дифференциального уравнения с заданной точностью
Описание метода сведения краевой задачи к задаче Коши. Решение системы из двух уравнений с четырьмя неизвестными. Метод Рунге-Кутта. Расчет максимальной погрешности и выполнение проверки точности. Метод конечных разностей. Описание полученных результатов.
Рубрика | Математика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 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