public static int Main() { // int n=5; int m = 4; var rand = new Random(1); // Assignment B matrix B = new matrix(m, m); for (int i = 0; i < m; i++) { for (int j = 0; j < m; j++) { B[i, j] = 10 * (rand.NextDouble()); } } WriteLine("Assignment B: "); B.print($"Square matrix A with size {m}x{m}, to do assigment B:"); var qr_B = new qrdecompositionGS(B); var B_inv = qr_B.inverse(); B_inv.print("The invers matrix of A, B=:"); var bbinv = B * B_inv; bbinv.print("A*B=I"); return(0); }
public void lsfit(Func <double, double>[] fs, vector x, vector y, vector dy) { int n = x.size, m = fs.Length; matrix A = new matrix(n, m); vector b = new vector(n); for (int i = 0; i < n; i++) { b[i] = y[i] / dy[i]; for (int k = 0; k < m; k++) { A[i, k] = fs[k](x[i]) / dy[i]; } } var qr_A = new qrdecompositionGS(A); var c = qr_A.backsubstitution(qr_A.R, qr_A.Q.transpose() * b); setC(c); var R_inv = qr_A.inverse(qr_A.R); // var R_inv = qr_A.backsubstitution(qr_A.R*(qr_A.Q.transpose()*qr_A.Q)); var S = R_inv * R_inv.transpose(); setS(S); f = fs; }
public static vector newton ( Func <vector, vector> f, //takes the input vector x and retrun f(x) vector xstart, //Starting point double eps = 1e-3, //The accuracy goal, ||f(x)||< epsilon double dx = 1e-6 //finite difference ) { vector x = xstart.copy(); int n = xstart.size; vector fx = f(x); vector y; vector fy; do { matrix J = new matrix(n, n); for (int j = 0; j < n; j++) { x[j] += dx; vector df = f(x) - fx; for (int i = 0; i < n; i++) { J[i, j] = df[i] / dx; } x[j] -= dx; } var JQR = new qrdecompositionGS(J); matrix B = JQR.inverse(); vector Dx = -B * fx; double s = 1; do { y = x + Dx * s; fy = f(y); if (fy.norm() < (1 - s / 2) * fx.norm()) { break; } if (s < 1.0 / 32) { break; } s /= 2; } while (true); x = y; fx = fy; if (fx.norm() < eps) { break; } } while (true); return(x); }
// Assignment B public matrix inverse() { int n = Q.size1, m = Q.size2; matrix A_inv = new matrix(n, m); vector e = new vector(n); var qr_B = new qrdecompositionGS(Q * R); for (int i = 0; i < n; i++) { e[i] = 1; A_inv[i] = qr_B.solve(e); e[i] = 0; } return(A_inv); }
public static int Main() { int n = 5; int m = 4; matrix A = new matrix(n, m); var rand = new Random(1); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { A[i, j] = 10 * (rand.NextDouble()); } } // A.1 WriteLine("Assignment A.1:"); A.print($"Matrix A {n}x{m}:"); var qr_A = new qrdecompositionGS(A); var Q = qr_A.Q; var R = qr_A.R; R.print($"The upper triangular matrix R:"); var qq = Q.transpose() * Q; qq.print($"Q^T Q =1: "); var qr = Q * R; qr.print($"Q*R=A: "); if (A.approx(Q * R)) { Write("Q*R=A, test passed\n"); } else { Write("Q*R!=A, test failed\n"); } WriteLine(""); // A.2 WriteLine("Assignment A.2:"); matrix A2 = new matrix(n, n); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { A2[i, j] = 10 * (rand.NextDouble()); } } A2.print($"Matrix A {n}x{n}:"); var qr_A2 = new qrdecompositionGS(A2); vector b = new vector(n); for (int i = 0; i < n; i++) { b[i] = 10 * (rand.NextDouble()); } b.print($"Vector b with size {n}: "); var qrxb = qr_A2.solve(qr_A2.Q, b); qrxb.print($"solve x for QRx=b:\nx = "); var ax = A2 * qrxb; ax.print("Ax = "); WriteLine("which is equal to b.\n"); return(0); }