public static vector newton(Func <vector, vector> f, vector x, double epsilon = 1e-3, double dx = 1e-7) { vector res = x.copy(); var n = res.size; var J = new matrix(n, n); while (true) { var fx = f(res); for (int j = 0; j < n; j++) { res[j] += dx; var df = f(res) - fx; for (int i = 0; i < n; i++) { J[i, j] = df[i] / dx; } res[j] -= dx; } var J_qr = LinEq.QrGsDecomp(J); var Dx = LinEq.QrGsSolve(J_qr, -fx); // Dx.print(); double s = 2; vector y, fy; double comp_norm; while (true) { s /= 2; y = res + Dx * s; fy = f(y); comp_norm = fy.norm(); if (comp_norm < (1 - s / 2) * comp_norm | s < 0.02) { break; } } res = y; fx = fy; comp_norm = Dx.norm(); if (comp_norm < dx | comp_norm < epsilon) { break; } } return(res); }
public void fit(Func <double, double>[] fs, vector x, vector y, vector dy) { var n = x.size; var m = fs.Length; var A = new matrix(n, m); var b = new vector(n); for (int i = 0; i < n; i++) { b[i] = y[i] / dy[i]; for (int j = 0; j < m; j++) { A[i, j] = fs[j](x[i]) / dy[i]; } } var qrData = LinEq.QrGsDecomp(A); c = LinEq.QrGsSolve(qrData, b); var inverse_R = LinEq.inverse(LinEq.QrGsDecomp(qrData.R)); S = inverse_R * inverse_R.T; }
public static void Main() { // matrix A = new matrix(6, 4); // for(int i = 0; i < A.size1; i++) // { // for(int j = 0; j < A.size2; j++) // { // A[i, j] = fixRand.NextDouble(); // } // } // A.print(); // var data = LinEq.QrGsDecomp(A); // data.Q.print(); // data.R.print(); // var qtq = data.Q.transpose()*data.Q; // qtq.print(); // var Ares = data.Q*data.R; // Ares.print(); Console.WriteLine("Testing A)"); Random fixRand = new Random(0); matrix A = new matrix(5, 5); vector B = new vector(5); for (int i = 0; i < A.size1; i++) { for (int j = 0; j < A.size2; j++) { A[j][i] = fixRand.NextDouble(); } } for (int i = 0; i < B.size; i++) { B[i] = fixRand.NextDouble(); } Console.WriteLine("The random Square matrix A"); A.print(); Console.WriteLine("The random Vector B for the Linear system Ax=B"); B.print(); var data = LinEq.QrGsDecomp(A); Console.WriteLine("The matrix Q"); data.Q.print(); Console.WriteLine("The matrix R"); data.R.print(); var res = LinEq.QrGsSolve(data, B); Console.WriteLine("Solution to the system QRx=b"); res.print(); var check = A * res; Console.WriteLine("Ax=b, should be equal to the random vector B"); check.print(); // Random fixRand = new Random(0); Console.WriteLine("Testing B)"); matrix Aforinverse = new matrix(5, 5); for (int i = 0; i < Aforinverse.size1; i++) { for (int j = 0; j < Aforinverse.size2; j++) { Aforinverse[i, j] = fixRand.NextDouble(); } } Console.WriteLine("Random square matrix A for inversion"); Aforinverse.print(); var dataB = LinEq.QrGsDecomp(Aforinverse); var Bforinverse = LinEq.inverse(dataB); var Cforinverse = Aforinverse * Bforinverse; Console.WriteLine("AA^-1 = I"); Cforinverse.print(); }