Файл: "Методы решения систем линейных алгебраических уравнений. Метод прогонки. Итерационные методы решения систем линейных алгебраических уравнений. Метод Якоби. Метод верхней релаксации. Метод Зейделя".docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 10.11.2023

Просмотров: 35

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Общий вид метода верхней релаксации:



где .

Вектор вычисляем путем последовательного вычисления каждой следующей итерации на основе предыдущей.

Для системы (1) метод верхней релаксации выглядит следующим образом:



Будем находить каждую следующую итерацию до тех пор, пока не выполнится условие:



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

Пусть

Наименьшее число итераций равно 6 при

Максимальная погрешность для данной : 0,062853823015049

Пусть

Наименьшее число итераций равно 10 при

Максимальная погрешность для данной : 0,0639706161866553

Пусть

Наименьшее число итераций равно 24 при

Максимальная погрешность для данной : 0,0560119004070355

Пусть

Наименьшее число итераций равно 50 при

Максимальная погрешность для данной : 0,0629145057540772

Пусть

Наименьшее число итераций равно 3 при


Максимальная погрешность для данной : 0,0351522803619569

Пусть

Наименьшее число итераций равно 87 при

Максимальная погрешность для данной : 0,0608771959171397


Вывод.


Метод верхней релаксации работает эффективнее метода Зейделя. Метод Зейделя работает эффективнее метода Якоби.

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

Метод прогонки

using System;

namespace Progonka

{

class Program

{

static void Main(string[] args)

{

int n = 50;

double h = 1.0 / n;

double a, a1, a2, b, c;

double g, f, u, maxpogr=0;

double[] P = new double[n];

double[] Q = new double[n];

double[] y = new double[n];
a1 = 1 + h;

a2 = 1 + 2 * h;

g = h + 1;

b = -(a1 + a2 + h * h * g);

c = -a2;

f = ((2 * h * Math.Pow((1 - h), 3) - 3 * h * h * (1 - h) * (1 - h) + (1 + h) * (2 * Math.Pow((1 - h), 3) - 12*h * (1 - h) * (1 - h) + 6 * h * h * (1 - h))) + (1 + h) * h * h * Math.Pow((1 - h), 3))*h*h;

P[2] = c / b;

Q[2] = -f / b;
for (int i = 2; i < n-1; i++)

{

a1 = (1 + i * h);

a2 = (1 + (i + 1) * h);

a = -a1;

g = i * h + 1;

b = -(a1 + a2 + h * h * g);

c = -a2;

f = ((2 * i*h * Math.Pow((1 - i*h), 3) - 3 * i*h * i*h * (1 - i*h) * (1 - i*h) + (1 + i*h) * (2 * Math.Pow((1 - i*h), 3) - 12 *i*h* (1 - i*h) * (1 - i*h) + 6 * i*h * i*h * (1 - i*h))) + (1 + i*h) * i*h * i*h * Math.Pow((1 - i*h), 3))*h*h;

P[i + 1] = c / (b - a * P[i]);

Q[i + 1] = (a * Q[i] - f) / (b - a * P[i]);

}
a1 = (1 + (n - 1) * h);

a2 = (1 + n*h);

a = -a1;

g = (n-1) * h + 1;

b = -(a1 + a2 + h * h * g);

f = ((2 * (n-1) * h * Math.Pow((1 - (n-1) * h), 3) - 3 * (n-1) * h * (n-1) * h * (1 - (n-1) * h) * (1 - (n-1) * h) + (1 + (n-1) * h) * (2 * Math.Pow((1 - (n-1) * h), 3) - 12*(n-1)*h * (1 - (n-1) * h) * (1 - (n-1) * h) + 6 * (n-1) * h * (n-1) * h * (1 - (n-1) * h))) + (1 + (n-1) * h) * (n-1) * h * (n-1) * h * Math.Pow((1 - (n-1) * h), 3)) * h * h;

y[n - 1] = (a*Q[n-1]-f)/(b-a*P[n-1]);
for (int i=n-1; i>1; i--)

{

y[i - 1] = P[i] * y[i] + Q[i];

}
for (int i=1; i
{

u = (i * h * i * h * Math.Pow((1 - i * h), 3));

Console.WriteLine("i="+i+"; y=" + y[i] +"; u=" +u + "; pogr=" + Math.Abs(y[i] - u));

if (Math.Abs(y[i] - u) > maxpogr)

maxpogr = Math.Abs(y[i] - u);

}

Console.WriteLine(maxpogr);
Console.ReadKey();

}

}

}

Метод Якоби

using System;
namespace Yakobi

{

class Program

{

static void Main(string[] args)

{

int n = 100, k=0;

double h = 1.0 / n;

double a1, a2, a, b, c, max=1, u, maxpogr=0;

double[] x = new double[n];

double[] y = new double[n];

double[] f = new double[n];

double[] r = new double[n];

double[] g = new double[n];
for (int i=1; i
{

g[i] = i * h + 1;

f[i] = ((2 * i * h * Math.Pow((1 - i * h), 3) - 3 * i * h * i * h * (1 - i * h) * (1 - i * h) + (1 + i * h) * (2 * Math.Pow((1 - i * h), 3) - 12 * i * h * (1 - i * h) * (1 - i * h) + 6 * i * h * i * h * (1 - i * h))) + (1 + i * h) * i * h * i * h * Math.Pow((1 - i * h), 3)) * h * h;

y[i] = 0;

}
while (max > 0.000001)

{

max = 0;

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

{

x[i] = y[i];

}

a1 = 1 + h;

a2 = 1 + 2 * h;



b = a1 + a2 + h * h * g[1];

c = -a2;

y[1] = -c * x[2] / b + f[1] / b;
for (int i=2; i
{

a1 = 1 + i * h;

a2 = 1 + (i + 1) * h;

a = -a1;

b = a1 + a2 + h * h * g[i];

c = -a2;

y[i] = -a * x[i - 1] / b - c * x[i + 1] / b + f[i] / b;

}
a1 = 1 + (n-1) * h;

a2 = 1 + n * h;

a = -a1;

b = a1 + a2 + h * h * g[n-1];

y[n - 1] = -a * x[n - 2] / b + f[n - 1] / b;
a1 = 1 + h;

a2 = 1 + 2 * h;

b = a1 + a2 + h * h * g[1];

c = -a2;

r[1] = f[1] - b * y[1] - c * y[2];

for (int i=2; i
{

a1 = 1 + i * h;

a2 = 1 + (i + 1) * h;

a = -a1;

b = a1 + a2 + h * h * g[i];

c = -a2;

r[i] = f[i] - a * y[i - 1] - b * y[i] - c * y[i + 1];

}

a1 = 1 + (n - 1) * h;

a2 = 1 + n * h;

a = -a1;

b = a1 + a2 + h * h * g[n - 1];

r[n - 1] = f[n - 1] - a * y[n - 2] - b * y[n - 1];
for (int i = 1; i < n; i++)

{

if (Math.Abs(r[i]) > max)

max = Math.Abs(r[i]);

}

k++;

}

Console.WriteLine(k);
for (int i = 1; i < n; i++)

{

u = (i * h * i * h * Math.Pow((1 - i * h), 3));

Console.WriteLine("pogr=" + Math.Abs(y[i]-u));

if (Math.Abs(y[i] - u) > maxpogr)

maxpogr = Math.Abs(y[i] - u);

}

Console.WriteLine(maxpogr);

Console.ReadKey();

}

}

}

Метод Зейделя

using System;
namespace Zeidel

{

class Program

{

static void Main(string[] args)

{

int n = 100, k = 0;

double h = 1.0 / n;

double a1, a2, a, b, c, max = 1, u, maxpogr=0;

double[] x = new double[n];

double[] y = new double[n];

double[] f = new double[n];

double[] r = new double[n];

double[] g = new double[n];
for (int i = 1; i < n; i++)

{

g[i] = i * h + 1;

f[i] = ((2 * i * h * Math.Pow((1 - i * h), 3) - 3 * i * h * i * h * (1 - i * h) * (1 - i * h) + (1 + i * h) * (2 * Math.Pow((1 - i * h), 3) - 12 * i * h * (1 - i * h) * (1 - i * h) + 6 * i * h * i * h * (1 - i * h))) + (1 + i * h) * i * h * i * h * Math.Pow((1 - i * h), 3)) * h * h;

y[i] = 0;

}
while (max > 0.000001)

{

max = 0;

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

{

x[i] = y[i];

}

a1 = 1 + h;

a2 = 1 + 2 * h;

b = a1 + a2 + h * h * g[1];

c = -a2;

y[1] = -c * x[2] / b + f[1] / b;
for (int i = 2; i < n - 1; i++)

{

a1 = 1 + i * h;

a2 = 1 + (i + 1) * h;

a = -a1;

b = a1 + a2 + h * h * g[i];

c = -a2;

y[i] = -a * y[i - 1] / b - c * x[i + 1] / b + f[i] / b;

}
a1 = 1 + (n - 1) * h;

a2 = 1 + n * h;

a = -a1;

b = a1 + a2 + h * h * g[n - 1];

y[n - 1] = -a * y[n - 2] / b + f[n - 1] / b;
a1 = 1 + h;

a2 = 1 + 2 * h;

b = a1 + a2 + h * h * g[1];

c = -a2;

r[1] = f[1] - b * y[1] - c * y[2];

for (int i = 2; i < n - 1; i++)

{

a1 = 1 + i * h;

a2 = 1 + (i + 1) * h;

a = -a1;

b = a1 + a2 + h * h * g[i];

c = -a2;

r[i] = f[i] - a * y[i - 1] - b * y[i] - c * y[i + 1];

}

a1 = 1 + (n - 1) * h;

a2 = 1 + n * h;

a = -a1;

b = a1 + a2 + h * h * g[n - 1];

r[n - 1] = f[n - 1] - a * y[n - 2] - b * y[n - 1];
for (int i = 1; i < n; i++)

{

if (Math.Abs(r[i]) > max)

max = Math.Abs(r[i]);

}

k++;

}

Console.WriteLine(k);
for (int i = 1; i < n; i++)

{

u = (i * h * i * h * Math.Pow((1 - i * h), 3));

Console.WriteLine("pogr=" + Math.Abs(y[i] - u));

if (Math.Abs(y[i] - u) > maxpogr)

maxpogr = Math.Abs(y[i] - u);

}

Console.WriteLine(maxpogr);
Console.ReadKey();

}

}

}

Метод верхней релаксации

using System;
namespace Relax

{

class Program

{

static void Main(string[] args)

{

int n = 100, k = 0;

double h = 1.0 / n;

double a1, a2, a, b, c, max = 1, u, w, minw=1, mink=100000, e=0.00001, maxpogr=0;

double[] x = new double[n];

double[] y = new double[n];

double[] f = new double[n];

double[] r = new double[n];


double[] g = new double[n];
for (int i = 1; i < n; i++)

{

g[i] = i * h + 1;

f[i] = ((2 * i * h * Math.Pow((1 - i * h), 3) - 3 * i * h * i * h * (1 - i * h) * (1 - i * h) + (1 + i * h) * (2 * Math.Pow((1 - i * h), 3) - 12 * i * h * (1 - i * h) * (1 - i * h) + 6 * i * h * i * h * (1 - i * h))) + (1 + i * h) * i * h * i * h * Math.Pow((1 - i * h), 3)) * h * h;

}
for (w = 1; w <= 2; w += 0.05)

{

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

y[i] = 0;

k = 0;

max = 1;

while (max > e)

{

max = 0;

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

{

x[i] = y[i];

}

a1 = 1 + h;

a2 = 1 + 2 * h;

b = a1 + a2 + h * h * g[1];

c = -a2;

y[1] = (1-w)*x[1]+w*( -c * x[2] / b + f[1] / b);
for (int i = 2; i < n - 1; i++)

{

a1 = 1 + i * h;

a2 = 1 + (i + 1) * h;

a = -a1;

b = a1 + a2 + h * h * g[i];

c = -a2;

y[i] = (1-w)*x[i]+w*(-a * y[i - 1] / b - c * x[i + 1] / b + f[i] / b);

}
a1 = 1 + (n - 1) * h;

a2 = 1 + n * h;

a = -a1;

b = a1 + a2 + h * h * g[n - 1];

y[n - 1] = (1-w)*x[n-1]+w*(-a * y[n - 2] / b + f[n - 1] / b);
a1 = 1 + h;

a2 = 1 + 2 * h;

b = a1 + a2 + h * h * g[1];

c = -a2;

r[1] = f[1] - b * y[1] - c * y[2];

for (int i = 2; i < n - 1; i++)

{

a1 = 1 + i * h;

a2 = 1 + (i + 1) * h;

a = -a1;

b = a1 + a2 + h * h * g[i];

c = -a2;

r[i] = f[i] - a * y[i - 1] - b * y[i] - c * y[i + 1];

}

a1 = 1 + (n - 1) * h;

a2 = 1 + n * h;

a = -a1;

b = a1 + a2 + h * h * g[n - 1];

r[n - 1] = f[n - 1] - a * y[n - 2] - b * y[n - 1];
for (int i = 1; i < n; i++)

{

if (Math.Abs(r[i]) > max)

max = Math.Abs(r[i]);

}

k++;

}

Console.WriteLine("w="+w+"; k="+k);

if (k < mink)

{

mink = k;

minw = w;

}

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

y[i] = 0;

k = 0;

max = 1;

while (max > e)

{

max = 0;

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

{

x[i] = y[i];

}

a1 = 1 + h;

a2 = 1 + 2 * h;

b = a1 + a2 + h * h * g[1];

c = -a2;

y[1] = (1 - minw) * x[1] + minw * (-c * x[2] / b + f[1] / b);
for (int i = 2; i < n - 1; i++)

{

a1 = 1 + i * h;

a2 = 1 + (i + 1) * h;

a = -a1;

b = a1 + a2 + h * h * g[i];

c = -a2;

y[i] = (1 - minw) * x[i] + minw * (-a * y[i - 1] / b - c * x[i + 1] / b + f[i] / b);

}
a1 = 1 + (n - 1) * h;

a2 = 1 + n * h;

a = -a1;

b = a1 + a2 + h * h * g[n - 1];

y[n - 1] = (1 - minw) * x[n - 1] + minw*(-a * y[n - 2] / b + f[n - 1] / b);
a1 = 1 + h;

a2 = 1 + 2 * h;

b = a1 + a2 + h * h * g[1];

c = -a2;

r[1] = f[1] - b * y[1] - c * y[2];

for (int i = 2; i < n - 1; i++)

{

a1 = 1 + i * h;

a2 = 1 + (i + 1) * h;

a = -a1;

b = a1 + a2 + h * h * g[i];

c = -a2;

r[i] = f[i] - a * y[i - 1] - b * y[i] - c * y[i + 1];

}

a1 = 1 + (n - 1) * h;

a2 = 1 + n * h;

a = -a1;

b = a1 + a2 + h * h * g[n - 1];

r[n - 1] = f[n - 1] - a * y[n - 2] - b * y[n - 1];
for (int i = 1; i < n; i++)

{

if (Math.Abs(r[i]) > max)

max = Math.Abs(r[i]);

}

k++;

}

Console.WriteLine("minw=" + minw + "; k=" + k);
for (int i = 1; i < n; i++)

{

u = (i * h * i * h * Math.Pow((1 - i * h), 3));

Console.WriteLine("pogr=" + Math.Abs(y[i] - u));

if (Math.Abs(y[i] - u) > maxpogr)

maxpogr = Math.Abs(y[i] - u);

}

Console.WriteLine(maxpogr);
Console.ReadKey();

}

}

}

Список литературы

1. Мацокин А. М., Сорокин С. Б. «Численные методы.».

2. Калинтин Н. Н. «Численные методы».

3. Бахвалов Н. С., Жидков Н. П., Кобельков Г. М. «Численные методы».

4. Колдаев В.Д. Численные методы и программирование. - Москва: ИНФРА-М, 2009