HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
 
 
Опции темы Поиск в этой теме Опции просмотра

  #11  
Старый 01.02.2009, 17:56
eLWAux
Постоянный
Регистрация: 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();
        }
    }
}
 
Ответить с цитированием
 



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Американским студентам запретили пользоваться Skype KPOT_f!nd Мировые новости. Обсуждения. 1 28.09.2006 03:47
Любителям квестов сюда!! FoX's Болталка 10 25.01.2005 20:42



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.