// f08wb Example Program Text // C# version, NAG Copyright 2008 using System; using NagLibrary; using System.Globalization; namespace NagDotNetExamples { public class F08WBE { static string datafile = "ExampleData/f08wbe.d"; static void Main(String[] args) { if (args.Length == 1) { datafile = args[0]; } StartExample(); } public static void StartExample() { try { DataReader sr = new DataReader(datafile); Complex eig= new Complex(0.0,0.0); double abnorm, abnrm, bbnrm, eps, erbnd, rcnd, small, tol; int i, ihi, ilo, info, j, n; Console.WriteLine("f08wb Example Program Results"); // Skip heading in data file sr.Reset(); sr.Reset(); n = int.Parse(sr.Next()); double[,] a = new double[n, n]; double[] alphai = new double[n]; double[] alphar = new double[n]; double[,] b = new double[n, n]; double[] beta = new double[n]; double[,] dummy = new double[1, 1]; double[] lscale = new double[n]; double[] rconde = new double[n]; double[] rcondv = new double[n]; double[] rscale = new double[n]; double[,] vr = new double[n, n]; if (n > 1) { // // Read in the matrices A and B // sr.Reset(); for (i = 1 ; i <= n ; i++) { for (j = 1 ; j <= n ; j++) { a[i - 1 , j - 1] = double.Parse(sr.Next(), CultureInfo.InvariantCulture); } } sr.Reset(); for (i = 1 ; i <= n ; i++) { for (j = 1 ; j <= n ; j++) { b[i - 1 , j - 1] = double.Parse(sr.Next(), CultureInfo.InvariantCulture); } } // // Solve the generalized eigenvalue problem // F08.f08wb("Balance", "No vectors (left)", "Vectors (right)", "Both reciprocal condition numbers", n, a, b, alphar, alphai, beta, dummy, vr, out ilo, out ihi, lscale, rscale, out abnrm, out bbnrm, rconde, rcondv, out info); if (info < 0) { return; } // if (info > 0) { Console.WriteLine(""); Console.WriteLine(" {0}{1,4}","Failure in DGGEVX. INFO =",info); } else { // // Compute the machine precision, the safe range parameter // small and sqrt(abnrm**2+bbnrm**2) // eps = X02.x02aj(); small = X02.x02am(); abnorm = F06.f06bn(abnrm, bbnrm); tol = eps * abnorm; // // Print out eigenvalues and vectors and associated condition // number and bounds // for (j = 1 ; j <= n ; j++) { // // Print out information on the jth eigenvalue // Console.WriteLine(""); if (((Math.Abs(alphar[j - 1]) + Math.Abs(alphai[j - 1])) * small) >= (Math.Abs(beta[j - 1]))) { Console.WriteLine(" {0}{1,2}{2}{3}\n {4}{5,2}{6}{7,11:e4}{8}{9,2}{10}{11,11:e4}{12}{13,2}{14}{15,11:e4}","Eigenvalue(",j,")"," is numerically infinite or undetermined","ALPHAR(",j,") = ",alphar[j - 1],", ALPHAI(",j,") = ",alphai[j - 1],", BETA(",j,") = ",beta[j - 1]); } else { if (alphai[j - 1] == 0.00e0) { Console.WriteLine(" {0}{1,2}{2}{3,11:e4}","Eigenvalue(",j,") = ",alphar[j - 1] / beta[j - 1]); } else { eig = new Complex(alphar[j - 1], alphai[j - 1]) / beta[j - 1]; Console.WriteLine(" {0}{1,2}{2}{3,11:e4}","Eigenvalue(",j,") = ",eig); } } rcnd = rconde[j - 1]; Console.WriteLine(""); Console.WriteLine(" {0}{1,8:e1}","Reciprocal condition number = ",rcnd); if (rcnd > 0.00e0) { erbnd = tol / rcnd; Console.WriteLine(" {0}{1,8:e1}","Error bound = ",erbnd); } else { Console.WriteLine(" {0}","Error bound is infinite"); } // // Print out information on the jth eigenvector // Console.WriteLine(""); Console.WriteLine(" {0}{1,2}{2}","Eigenvector(",j,")"); if (alphai[j - 1] == 0.00e0) { for (i = 1 ; i <= n ; i++) { Console.WriteLine(" {0, 11:e4}", vr[i - 1 , j - 1]); } Console.WriteLine(); } else if (alphai[j - 1] > 0.00e0) { for (i = 1 ; i <= n ; i++) { Console.WriteLine(" ( {0, 11:e4}, {1, 11:e4})", vr[i - 1 , j - 1], vr[i - 1 , j + 1 - 1]); } Console.WriteLine(); } else { for (i = 1 ; i <= n ; i++) { Console.WriteLine("( {0, 11:e4}, {1, 11:e4})", vr[i - 1 , j - 1 - 1], -vr[i - 1 , j - 1]); } Console.WriteLine(); } rcnd = rcondv[j - 1]; Console.WriteLine(""); Console.WriteLine(" {0}{1,8:e1}","Reciprocal condition number = ",rcnd); if (rcnd > 0.00e0) { erbnd = tol / rcnd; Console.WriteLine(" {0}{1,8:e1}","Error bound = ",erbnd); } else { Console.WriteLine(" {0}","Error bound is infinite"); } } // } } else { Console.WriteLine(""); Console.WriteLine(" {0}","n < 1."); } // } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine("Exception Raised"); } } } }