Advertisement
Guest User

Roots of polynomial , eigenvalue method

a guest
Jan 12th, 2022
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.31 KB | None | 0 0
  1. using System;
  2. using System.IO;
  3. using System.Globalization;
  4. namespace NamespaceName
  5. {
  6.     public class ClassName
  7.     {
  8.         const int maxiter = 1000;
  9.         const double eps = 1e-12;
  10.         public static double hypot(double a,double b)
  11.         {
  12.             double absa,absb;
  13.             absa = Math.Abs(a);
  14.             absb = Math.Abs(b);
  15.             if(absa > absb) return absa * Math.Sqrt(1+(double)(absb/absa)*(double)(absb/absa));
  16.             else return (absb == 0?0: absb * Math.Sqrt(1 + (double)(absa/absb)*(double)(absa/absb)));
  17.            
  18.         }
  19.         public static void printMatrix(int m,int n, double[,] A)
  20.         {
  21.             NumberFormatInfo nfi = new NumberFormatInfo();
  22.             nfi.NumberDecimalDigits = 12;
  23.             for(int i = 0;i < m;i++)
  24.             {
  25.                 for(int j = 0; j < n; j++)
  26.                 {
  27.                     Console.Write("{0} , ",A[i,j].ToString("N",nfi));
  28.                 }
  29.                 Console.WriteLine();
  30.             }
  31.             Console.WriteLine();
  32.         }
  33.         public static void QR_Givens(int m,int n,double [,] A,double[,] Q)
  34.         {
  35.             for(int i = 0; i < m; i++)
  36.                 for(int j = 0; j < m; j++)
  37.                     Q[i,j] = (i == j ? 1 : 0);
  38.             int min = (m < n ? m : n);
  39.             for(int i = 0; i < min; i++)
  40.             {
  41.                 for(int j = i + 1; j < m; j++)
  42.                 {
  43.                     if(A[j,i] != 0)
  44.                     {
  45.                         double r = hypot(A[i,i],A[j,i]);
  46.                         double c = (double) (A[i,i]/r);
  47.                         double s = (double) (A[j,i]/r);
  48.                         for(int k = 0;k < n; k++)
  49.                         {
  50.                             double temp = A[i,k];
  51.                             A[i,k] = c * A[i,k] + s * A[j,k];
  52.                             A[j,k] = -s * temp + c * A[j,k];
  53.                         }
  54.                         for(int k = 0;k < m;k++)
  55.                         {
  56.                             double temp = Q[k,i];
  57.                             Q[k,i] = c * Q[k,i] + s * Q[k,j];
  58.                             Q[k,j] = -s * temp + c * Q[k,j];
  59.                         }
  60.                     }
  61.                 }
  62.             }
  63.                
  64.         }
  65.         public static void copyMatrix(double[,] A,double[,] B,int m,int n)
  66.         {
  67.             for(int i = 0;i < m;i++)
  68.                 for(int j = 0;j < n;j++)
  69.                     B[i,j] = A[i,j];
  70.         }
  71.         public static void multiplyMatrix(double[,] A,double[,] B,double[,] C,int m,int n,int p)
  72.         {
  73.             for(int i = 0;i < m;i++)
  74.                 for(int j = 0;j < p;j++)
  75.                 {
  76.                     double sum = 0;
  77.                     for(int k = 0;k < n;k++)
  78.                         sum += A[i,k] * B[k,j];
  79.                     C[i,j] = sum;
  80.                 }
  81.         }
  82.         public static double rayleigh(int n, double[,] A,double[] q)
  83.         {
  84.             double norm = 0;
  85.             double sum;
  86.             double[] v = new double[n];
  87.             for(int i = 0;i < n;i++)
  88.                 norm += q[i] * q[i];
  89.             for(int i = 0;i < n;i++)
  90.             {
  91.                 sum = 0;
  92.                 for(int j = 0;j < n;j++)
  93.                     sum += A[i,j]*q[j];
  94.                 v[i] = sum;
  95.             }
  96.             double r = 0;
  97.             for(int i = 0;i < n;i++)
  98.                 r += q[i]*v[i];
  99.             r /= (double)norm;
  100.             return r;
  101.         }
  102.         public static void Main(string[] args)
  103.         {
  104.             char esc;
  105.             int n;
  106.             double[,] A,Q,R;
  107.             double[] v;
  108.             double[] a;
  109.             double r;
  110.             Random rnd = new Random();
  111.             NumberFormatInfo nfi = new NumberFormatInfo();
  112.             nfi.NumberDecimalDigits = 12;
  113.            
  114.            
  115.             using(StreamWriter sw = new StreamWriter("polyroots.txt",true))
  116.             {
  117.                 do
  118.                 {
  119.                 Console.WriteLine("Podaj stopien wielomianu");
  120.                 int.TryParse(Console.ReadLine(),out n);
  121.                 A = new double[n,n];
  122.                 Q = new double[n,n];
  123.                 R = new double[n,n];
  124.                 v = new double[n];
  125.                 a = new double[n + 1];
  126.                 for(int i = n;i >= 0;i--)
  127.                 {
  128.                     Console.Write("Podaj a[{0}]= ", i);
  129.                     double.TryParse(Console.ReadLine(),out a[i]);
  130.                 }
  131.                 for(int i = n;i >= 0;i--)
  132.                     if(a[i] < 0)
  133.                         sw.WriteLine("-{0}x^{1} ",(-a[i]).ToString("N",nfi),i);
  134.                     else
  135.                         sw.WriteLine("+{0}x^{1} ",a[i].ToString("N",nfi),i);
  136.                     sw.WriteLine();
  137.                 for(int i=0;i<n;i++)
  138.                     A[0,i] = (double)(-a[n-i-1]/a[n]);
  139.                 for(int i = 1;i < n;i++)
  140.                     for(int j = 0;j<n;j++)
  141.                         A[i,j] = (i == j+1)?1:0;
  142.                 printMatrix(n,n,A);
  143.                 for(int i = 0;i < n;i++)
  144.                 {
  145.                     for(int j = 0; j < n; j++)
  146.                         sw.Write("{0} ",A[i,j].ToString("N",nfi));
  147.                     sw.WriteLine();
  148.                 }
  149.                 sw.WriteLine();
  150.                 for(int i = 0;i < n;i++)
  151.                     v[i] = i + rnd.NextDouble();
  152.                 for(int i = 0;i < maxiter;i++)
  153.                 {
  154.                     r = rayleigh(n,A,v);
  155.                     for(int j = 0;j < n;j++)
  156.                         A[j,j] -= r;
  157.                     QR_Givens(n,n,A,Q);
  158.                     copyMatrix(A,R,n,n);
  159.                     multiplyMatrix(R,Q,A,n,n,n);
  160.                     for(int j = 0;j < n;j++)
  161.                         A[j,j] += r;
  162.                     for(int j = 0;j < n;j++)
  163.                         v[j] = Q[n-1,j];
  164.                 }
  165.                 printMatrix(n,n,A);
  166.                 for(int i = 0;i < n;i++)
  167.                 {
  168.                     for(int j = 0; j < n; j++)
  169.                         sw.Write("{0} ",A[i,j].ToString("N",nfi));
  170.                     sw.WriteLine();
  171.                 }
  172.                 sw.WriteLine();
  173.                 Console.WriteLine("Pierwiastki danego rownania wielomianowego to: ");
  174.                 sw.WriteLine("Pierwiastki danego rownania wielomianowego to: ");
  175.                 int k = 0;
  176.                 while(k<n)
  177.                 {
  178.                     if(k + 1 < n && Math.Abs(A[k+1,k])>eps)
  179.                     {
  180.                         double p = 0.5*(A[k,k]+A[k+1,k+1]);
  181.                         double q = A[k,k] * A[k+1,k+1] - A[k,k+1] * A[k + 1,k];
  182.                         double d = q - p * p;
  183.                         Console.WriteLine("x[{0}]={1}-{2}i",k,p.ToString("N",nfi),Math.Sqrt(d).ToString("N",nfi));
  184.                         Console.WriteLine("x[{0}]={1}+{2}i",k+1,p.ToString("N",nfi),Math.Sqrt(d).ToString("N",nfi));
  185.                         sw.WriteLine("x[{0}]={1}-{2}i",k,p.ToString("N",nfi),Math.Sqrt(d).ToString("N",nfi));
  186.                         sw.WriteLine("x[{0}]={1}+{2}i",k+1,p.ToString("N",nfi),Math.Sqrt(d).ToString("N",nfi));
  187.                         k += 2;
  188.                     }
  189.                     else
  190.                     {
  191.                         Console.WriteLine("x[{0}]={1}",k,A[k,k].ToString("N",nfi));
  192.                         sw.WriteLine("x[{0}]={1}",k,A[k,k].ToString("N",nfi));
  193.                         k++;
  194.                     }
  195.                 }
  196.                 esc = (char) Console.ReadKey().Key;
  197.             }
  198.             while(esc != (char)ConsoleKey.Escape);
  199.         }
  200.         }
  201.     }
  202. }
  203.  
  204.  
  205.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement