
01.02.2009, 17:56
|
|
Постоянный
Регистрация: 15.06.2008
Сообщений: 941
С нами:
9423746
Репутация:
2399
|
|
может кому пригодитса
Решить систему нел. уравнений модифицированным методом Ньютона, выбирая за начальные приближения . Итерации проводить к совпадению двух последовательных приближений с погрешностью . Производные вычислять методом конечных разниц, вращения матрицы, проводить классическим методом Гауса.
C#
Код:
using System;
using System.Collections.Generic;
using System.Text;
namespace ZI_22_KMDI_5
{
class Lab
{
const int n = 2;
double E = 0.00001;
double[] X1 = { 0, 0 };
double[] X2 = new double[n];
double[,] MatrixJakobi(double[] X)
{
double[,] J = new double[n, n];
double y, h = 0.000000001;
for (int i = 0; i < n; i++)
{
y = Funkcia(X, i);
for(int k = 0; k < n; k++)
{
X[k] = X[k] + h;
J[i,k] = (Funkcia(X,i) - y)/h;
X[k] = X[k] - h;
}
}
return (J);
}
double Funkcia(double[] X, int f)
{
double fx = 0;
if (f == 0)
fx = -X[0] + X[0] * X[0] - X[1] * X[1] + 0.1;
if (f == 1)
fx = -X[1] + 2 * X[0] * X[1] - 0.1;
return (fx);
}
double[] Funkcii(double[] X)
{
double[] F = new double[n];
F[0] = -X[0] + X[0] * X[0] - X[1] * X[1] + 0.1;
F[1] = -X[1] + 2 * X[0] * X[1] - 0.1;
return (F);
}
bool Pohubka(double[] mX1, double[] mX2)
{
double a, b;
a = (mX2[0] - mX1[0]) / mX1[0]; a = Math.Abs(a);
b = (mX2[1] - mX1[1]) / mX1[1]; b = Math.Abs(b);
Console.WriteLine(Math.Max(a,b));
if (Math.Max(a,b) <= E)
return (true);
else
return (false);
}
double[,] Obertanna(double[,] A)
{
double[] b = new double[n];
double[,] X = new double[n, n];
double[] dX = new double[n];
for (int k = 0; k < n; k++)
{
for (int i = 0; i < n; i++)
{
if (k == i)
b[i] = 1;
else
b[i] = 0;
}
dX = Gaus(A, b);
for (int i = 0; i < n; i++)
X[i, k] = dX[i];
}
return (X);
}
double[] Gaus(double[,] A, double[] b)
{
double[,] GausA = new double[n, (n + 1)];
double[] X = new double[n];
for(int i = 0; i < n; i++)
for (int j = 0; j < (n + 1); j++)
{
if (j != n)
GausA[i, j] = A[i, j];
else
GausA[i, j] = -b[i];
}
for (int l = 0; l < n - 1; l++)
{
double c = GausA[l, l];
for (int k = l + 1; k < (n+1); k++)
{
GausA[l, k] = -GausA[l, k] / c;
for (int i = l + 1; i < n; i++)
GausA[i, k] = GausA[i, k] + GausA[i, l] * GausA[l, k];
}
}
X[n - 1] = -GausA[n - 1, n] / GausA[n - 1, n - 1];
for (int i = n - 2; i >= 0; i--)
{
double s = GausA[i, n];
for (int k = i + 1; k < n; k++)
s = s + GausA[i, k] * X[k];
X[i] = s;
}
return (X);
}
double[] Mnogenna(double[,] A, double[] B)
{
double[] C = new double[n];
C[0] = A[0, 0] * B[0] + A[0, 1] * B[1];
C[1] = A[1, 0] * B[0] + A[1, 1] * B[1];
return (C);
}
public void Calculate()
{
double[,] A = new double[n, n];
double[] fX = new double[n];
double[] Mn = new double[n];
int d = 0;
A = MatrixJakobi(X1);
A = Obertanna(A);
fX = Funkcii(X1);
Mn = Mnogenna(A, fX);
X2[0] = X1[0] - Mn[0];
X2[1] = X1[1] - Mn[1];
d++;
while (Pohubka(X1, X2) != true)
{
if (d > 5)
{
A = MatrixJakobi(X1);
A = Obertanna(A);
}
X1[0] = X2[0];
X1[1] = X2[1];
fX = Funkcii(X1);
Mn = Mnogenna(A, fX);
X2[0] = X1[0] - Mn[0];
X2[1] = X1[1] - Mn[1];
d++;
Console.WriteLine("x(1) = " + X2[0]);
Console.WriteLine("x(2) = " + X2[1]);
}
Console.WriteLine("------");
Console.WriteLine("Результат");
Console.WriteLine("x(1) = " + X2[0]);
Console.WriteLine("x(2) = " + X2[1]);
Console.WriteLine("------");
Console.WriteLine("Перевiрка 1");
Console.WriteLine(-X2[0] + X2[0] * X2[0] - X2[1] * X2[1] + 0.1);
Console.WriteLine(-X2[1] + 2 * X2[0] * X2[1] - 0.1);
Console.WriteLine("Перевiрка 2");
Console.WriteLine(X2[0] + " = " + (X2[0] * X2[0] - X2[1] * X2[1] + 0.1));
Console.WriteLine(X2[1] + " = " + (2 * X2[0] * X2[1] - 0.1));
}
}
class Program
{
static void Main(string[] args)
{
Lab lab5 = new Lab();
lab5.Calculate();
Console.Read();
}
}
}
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|