Листинг программы.
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;
}
}
}