Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace ConsoleApplication8
- {
- class Program
- {
- const int n = 2;
- const double eps = 1e-11;
- /*Задание функции
- х - столбец значений неизвестных
- i - номер функции в системе*/
- static double func(double[] x, int i)
- {
- switch (i)
- {
- case 0:
- return (Math.Sin(x[0])+2*(x[1]) - 2); //вычисляем значение первой функции
- case 1:
- return (Math.Cos(x[1] - 1) + x[0] -0.7); //вычисляем значение второй функции
- }
- throw new ArgumentException();
- }
- /*Задание якобиана
- * х - столбец значений неизвестных
- * i,j индексы элементов якобиана
- * i - номер строки
- * j - номер столбца
- */
- static double jacobian(double[] x, int i, int j)
- {
- switch (i)
- {
- case 0:
- switch (j)
- {
- case 0:
- return (Math.Cos(x[0]));
- case 1:
- return (2);
- }
- break;
- case 1:
- switch (j)
- {
- case 0:
- return(1);
- case 1:
- return(-1 * Math.Sin(x[1] - 1));
- }
- break;
- }
- throw new ArgumentException();
- }
- //вывод вектора
- static void vivod_vectr(double[] vect)
- {
- for (int j = 0; j < n; j++)
- {
- Console.WriteLine("x{0} = {1}", j, vect[j]);
- }
- }
- static void simq(int nn, double[,] a, double[] bb)
- {
- const double eps1 = 1e-21;
- double max, u, v;
- int ks, k1;
- double[,] aa = new double[n,n+1];
- for (int i = 0; i < nn; i++)
- {
- aa[i, nn + 1] = bb[i];
- }
- for (int i = 0; i < nn; i++)
- {
- for (int j = 0; j < nn; j++)
- {
- aa[i, j] = a[i, j];
- }
- }
- for (int i = 0; i < nn; i++)
- {
- max = Math.Abs(aa[i,i]);
- k1 = i;
- for (int l = (i+1); l < nn ; l++)
- {
- if (Math.Abs(aa[l, i]) > max)
- {
- max = Math.Abs(aa[l,i]);
- k1 = l;
- }
- }
- if (max < eps1)
- {
- ks = 1;
- break;
- }
- else
- ks = 0;
- if (k1 != i)
- {
- for (int j = 0; j < (nn+1); j++)
- {
- u = aa[i,j];
- aa[i,j] = aa[k1,j];
- aa[k1,j] = u;
- }
- }
- v = aa[i,i];
- for (int j = 0; j < (nn+1); j++)
- {
- aa[i,j] = aa[i,j]/v;
- }
- for (int l = (i + 1); l < nn; l++)
- {
- v = aa[l, i];
- for (int j = (i + 1); j < (nn + 1); j++)
- {
- aa[l, j] = aa[l, j] - aa[i, j] * v;
- }
- }
- }
- bb[nn] = aa[nn, nn + 1];
- for (int i = (nn - 1); i >= 0; i--)
- {
- bb[i] = aa[i, nn + 1];
- for (int j = (i + 1); j < nn; j++)
- {
- bb[j] = bb[i] - aa[i, j] * bb[j];
- }
- }
- }
- static void Main(string[] args)
- {
- double[,] a = new double[n, n];
- double[] x = new double[n];
- double[] f = new double[n];
- double[] dx = new double[n];
- double max = 0;
- int iter = 0;
- x[0] = 0;
- x[1] = 0;
- do
- {
- vivod_vectr(x);
- Console.WriteLine("nomer iter {0}", iter);
- Console.WriteLine("==============");
- iter++;
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < n; j++)
- {
- a[i, j] = jacobian(x,i,j);
- }
- }
- for (int i = 0; i < n; i++)
- {
- f[i] = -1 * func(x, i);
- }
- simq(n, a, f);
- dx = f;
- max = Math.Abs(dx[0]);
- for (int i = 0; i < n; i++)
- {
- if (Math.Abs(dx[i]) > max)
- max = Math.Abs(dx[i]);
- }
- for (int i = 0; i < n; i++)
- {
- x[i] = x[i]+dx[i];
- }
- }
- while (max < eps);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment