Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Итерационные методы решения систем линейных алгебраических уравнений. Метод Якоби. Метод нижней релаксации.docx
Скачиваний:
137
Добавлен:
06.01.2017
Размер:
37.27 Кб
Скачать

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

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.IO;

namespace CHM5

{

class Program

{

static int n = 40;

static double h = 1.0 / n;

static double eps = Math.Pow(h, 6);

static double[] x = new double[n + 1];

static double[] ai = new double[n + 1];

static double[] qi = new double[n + 1];

static double[] fi = new double[n + 1];

static double[] alpha = new double[n + 1];

static double[] beta = new double[n + 1];

static double[] a_big = new double[n + 1];

static double[] b_big = new double[n + 1];

static double[] c_big = new double[n + 1];

static double[,] A = new double[3, n + 1];

static double[] y = new double[n + 1];

static double[] y_jacobi = new double[n + 1];

static double[] y_relax = new double[n + 1];

static int k;

static int best_k = 99999;

static double best_omega;

public static double Px(double x)

{

return 1 + Math.Pow(x, 3);

}

public static double Qx(double x)

{

return x + 1;

}

public static double Ux(double x)

{

return x * Math.Sqrt(x) * Math.Pow((1 - x), 3);

}

public static double Fx(double x)

{

return 1 / (4 * Math.Sqrt(x)) * 3 * (39 * Math.Pow(x, 6) - 77 * Math.Pow(x, 5) + 45 * Math.Pow(x, 4)

+ 14 * Math.Pow(x, 3) - 35 * x * x + 15 * x - 1) + x * Math.Sqrt(x) * (Math.Pow((1 - x), 3) * (x + 1));

}

static void Main(string[] args)

{

alpha[1] = 0; // так как c0=0

beta[1] = 0; //так как f0=0

y[0] = 0;

y[n] = 0;

// вычисление a[i],q[i],f[i]

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

{

ai[i] = Px(i * h);

qi[i] = Qx(i * h);

fi[i] = Fx(i * h) * Math.Pow(h, 2);

}

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

x[i] = i * h;

// вычисление A,B,C

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

{

a_big[i] = -ai[i];

b_big[i] = -(ai[i] + ai[i + 1] + h * h * qi[i]);

c_big[i] = -ai[i + 1];

}

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

A[0, i] = a_big[i];

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

A[1, i] = b_big[i];

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

A[2, i] = c_big[i];

// вычисление alpha, beta

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

{

alpha[i + 1] = c_big[i] / (b_big[i] - a_big[i] * alpha[i]);

beta[i + 1] = (a_big[i] * beta[i] - fi[i]) / (b_big[i] - a_big[i] * alpha[i]);

}

// вычисление y[i]

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

{

y[i] = alpha[i + 1] * y[i + 1] + beta[i + 1];

}

y_jacobi = Jacobi(ai, fi, qi);

//печать метода Якоби

using(StreamWriter sw = new StreamWriter("C:/Users/Роман/Desktop/yakobi.txt"))

{

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

sw.WriteLine("{0}\t{1}\t{2}\t{3:0.000000000}", i * h, y[i], y_jacobi[i], Math.Abs(y[i] - y_jacobi[i]));

sw.WriteLine("Количество итераций: {0}",k);

}

y_relax = Relax(ai, fi, qi);

//печать метода релаксации

using (StreamWriter sw = new StreamWriter("C:/Users/Роман/Desktop/relax.txt"))

{

sw.WriteLine("Вычисления для омега={0}",best_omega);

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

sw.WriteLine("{0}\t{1}\t{2}\t{3:0.000000000}", i * h, y[i], y_relax[i], Math.Abs(y[i] - y_relax[i]));

}

}

public static double[] Jacobi(double[] a,double[] f,double[] g)

{

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

double[] y_pre = new double[n + 1];

double r;

k = 0;

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

y[i] = 0;

do

{

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

y_pre[i] = y[i];

r = -1;

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

y[i] = (f[i] + a[i + 1] * y_pre[i + 1] + a[i] * y_pre[i - 1]) / (a[i] + a[i + 1] + g[i] * h * h);

k++;

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

if (Math.Abs(-a[i + 1] * y[i + 1] + (a[i + 1] + a[i] + g[i] * h * h) * y[i] - a[i] * y[i - 1] - f[i]) > r)

r = Math.Abs(-a[i + 1] * y[i + 1] + (a[i + 1] + a[i] + g[i] * h * h) * y[i] - a[i] * y[i - 1] - f[i]);

} while (r > eps);

return y;

}

public static double[] Relax(double[] a, double[] f,double[] g)

{

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

double[] y_pre = new double[n + 1];

double r = 0;

for(double omega =0.05;omega<1;omega+=0.05)

{

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

y[i] = 0;

k = 0;

do

{

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

y_pre[i] = y[i];

r = -1;

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

y[i] = (f[i] + a[i + 1] * y_pre[i + 1] + a[i] * y[i - 1]) / (a[i + 1] + a[i] + g[i] * h * h) * omega + (1 - omega) * y_pre[i];

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

if (Math.Abs(-a[i + 1] * y[i + 1] + (a[i + 1] + a[i] + g[i] * h * h) * y[i] - a[i] * y[i - 1] - f[i]) > r)

r = Math.Abs(-a[i + 1] * y[i + 1] + (a[i + 1] + a[i] + g[i] * h * h) * y[i] - a[i] * y[i - 1] - f[i]);

k++;

} while (r > 0.000001);

if(k<best_k)

{

best_omega = omega;

best_k = k;

}

using (StreamWriter sw = new StreamWriter("C:/Users/Роман/Desktop/omega.txt",true))

{

sw.WriteLine("{0}\t{1}\n", omega, k);

}

}

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

y[i]=0;

k=0;

do

{

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

y_pre[i] = y[i];

r = -1;

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

y[i] = (f[i] + a[i + 1] * y_pre[i + 1] + a[i] * y[i - 1]) / (a[i + 1] + a[i] + g[i] * h * h) * best_omega + (1 - best_omega) * y_pre[i];

k++;

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

if (Math.Abs(-a[i + 1] * y[i + 1] + (a[i + 1] + a[i] + g[i] * h * h) * y[i] - a[i] * y[i - 1] - f[i]) > r)

r = Math.Abs(-a[i + 1] * y[i + 1] + (a[i + 1] + a[i] + g[i] * h * h) * y[i] - a[i] * y[i - 1] - f[i]);

} while (r > eps);

return y;

}

}

}