Advertisement
Guest User

Untitled

a guest
Jun 19th, 2019
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.64 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include "MAT.h"
  4. #include "VEC.h"
  5. #include <vector>
  6. #include <cmath>
  7.  
  8.  
  9. using namespace std;
  10.  
  11. double fn1(double x) {
  12.     return pow(2, x) + pow(2, pow(2, 2*x)) - 3;
  13. }
  14.  
  15. double fn2(double x) {
  16.     return pow(2, x) + 3;
  17. }
  18.  
  19. double fn3(double x) {
  20.     return sin(2*x) + sin(4 * x*x) + sin(8*x*x*x) - 1;
  21. }
  22.  
  23. double fn4(double x) {
  24.     return pow(2, x) + pow(sin(x), 2)*pow( cos(x),2) - 1;
  25. }
  26.  
  27. double fn5(double x) {
  28.     return 1.0 / x + 1.0 / x / x + 1.0 /x/x/x + 1.0 /x/x/x/x - 1;
  29. }
  30.  
  31.  
  32. double fn6(double x) {
  33.     return x + pow(x, 1.0/2) + pow(x, 1.0/3)  + pow(x, 1.0/4) - 10;
  34. }
  35.  
  36. void p2_1() {
  37.     int max_iter = 10000;
  38.     double tol = 1e-10;
  39.     VEC X = zeros(2);
  40.     MAT A = mat_zeros(2);
  41.     VEC X_prev = zeros(2);
  42.     MAT J(2);
  43.     VEC b(2);
  44.     double error = tol + 1 ;
  45.     for (int i=0; i<max_iter && error >= tol; i++) {
  46.         J[0][0] = 2*X_prev[0] + 3;
  47.         J[0][1] = -1;
  48.         J[1][0] = -1;
  49.         J[1][1] = 6*X_prev[1] + 1;
  50.         b[0] = X_prev[0] * X_prev[0] + 3 * X_prev[0] - X_prev[1] - 3.81;
  51.         b[1] = 3*X_prev[1]*X_prev[1] + X_prev[1] - X_prev[0] - 1.07;
  52.         X = LU_fact_and_solve(J, J*X_prev - b);
  53.         error = infnorm(X_prev - X);
  54.         cout << "err " << error << endl;
  55.         X_prev = X;
  56.     }
  57.     cout << "ans:\n";
  58.     X.show();
  59. }
  60.  
  61. void p2_2() {
  62.     int max_iter = 10000;
  63.     double tol = 1e-10;
  64.     VEC X = zeros(2);
  65.     MAT A = mat_zeros(2);
  66.     VEC X_prev = zeros(2);
  67.     MAT J(2);
  68.     VEC b(2);
  69.     double error = tol + 1 ;
  70.     for (int i=0; i<max_iter && error >= tol; i++) {
  71.         J[0][0] = 2*X_prev[0] + X_prev[1] + 1;
  72.         J[0][1] = X_prev[0] + 2 * X_prev[1];
  73.         J[1][0] = 1;
  74.         J[1][1] = 2*X_prev[1] + 1;
  75.         b[0] = X_prev[0] * X_prev[0] + X_prev[0] * X_prev[1]\
  76.             + X_prev[1] * X_prev[1] + X_prev[0]-4.16;
  77.         b[1] = X_prev[1]*X_prev[1] + X_prev[0] + X_prev[1]-2.56;
  78.         X = LU_fact_and_solve(J, J*X_prev - b);
  79.         error = infnorm(X_prev - X);
  80.         cout << "err " << error << endl;
  81.         X_prev = X;
  82.     }
  83.     cout << "ans:\n";
  84.     X.show();
  85. }
  86.  
  87.  
  88. void p2_3() {
  89.     int max_iter = 10000;
  90.     double tol = 1e-10;
  91.     VEC X = zeros(2);
  92.     MAT A = mat_zeros(2);
  93.     VEC X_prev = zeros(2);
  94.     MAT J(2);
  95.     VEC b(2);
  96.     double error = tol + 1 ;
  97.     for (int i=0; i<max_iter && error >= tol; i++) {
  98.         J[0][0] = 1.0 / 2 / sqrt(X_prev[0]+1);
  99.         J[0][1] = -1;
  100.         J[1][0] = -1;
  101.         J[1][1] = 1.0 / 2 / sqrt(X_prev[1] +2);
  102.         b[0] = sqrt(X_prev[0] +1 ) - X_prev[1] - 0.60384;
  103.         b[1] = sqrt(X_prev[1]+2) -X_prev[0] - 0.943168;
  104.         X = LU_fact_and_solve(J, J*X_prev - b);
  105.         error = infnorm(X_prev - X);
  106.         cout << "err " << error << endl;
  107.         X_prev = X;
  108.     }
  109.     cout << "ans:\n";
  110.     X.show();
  111. }
  112.  
  113.  
  114. void p2_4() {
  115.     int max_iter = 10000;
  116.     double tol = 1e-10;
  117.     VEC X = zeros(2);
  118.     MAT A = mat_zeros(2);
  119.     VEC X_prev = zeros(2);
  120.     MAT J(2);
  121.     VEC b(2);
  122.     double error = tol + 1 ;
  123.     for (int i=0; i<max_iter && error >= tol; i++) {
  124.         J[0][0] = 3*X_prev[0]*X_prev[0] + 1;
  125.         J[0][1] = -1;
  126.         J[1][0] = -1;
  127.         J[1][1] = 3*X_prev[1]*X_prev[1] + 2;
  128.         b[0] = pow(X_prev[0], 3) +X_prev[0] - X_prev[1] + 1.375;
  129.         b[1] = pow(X_prev[1], 3) + 2 * X_prev[1] - X_prev[0] - 11.5;
  130.         X = LU_fact_and_solve(J, J*X_prev - b);
  131.         error = infnorm(X_prev - X);
  132.         cout << "err " << error << endl;
  133.         X_prev = X;
  134.     }
  135.     cout << "ans:\n";
  136.     X.show();
  137. }
  138.  
  139.  
  140. void p2_5() {
  141.     int max_iter = 10000;
  142.     double tol = 1e-10;
  143.     VEC X = zeros(2);
  144.     MAT A = mat_zeros(2);
  145.     VEC X_prev = zeros(2);
  146.     X_prev[0] = X_prev[1] = 2;
  147.     MAT J(2);
  148.     VEC b(2);
  149.     double error = tol + 1 ;
  150.     for (int i=0; i<max_iter && error >= tol; i++) {
  151.         J[0][0] = cos(X_prev[0]);
  152.         J[0][1] = -1;
  153.         J[1][0] = -1;
  154.         J[1][1] = -sin(X_prev[1]);
  155.         b[0] = sin(X_prev[0]) - X_prev[1] + 0.208793;
  156.         b[1] = cos(X_prev[1]) - X_prev[0] + 0.646404;
  157.         X = LU_fact_and_solve(J, J*X_prev - b);
  158.         error = infnorm(X_prev - X);
  159.         cout << "err " << error << endl;
  160.         X_prev = X;
  161.     }
  162.     cout << "ans:\n";
  163.     X.show();
  164. }
  165.  
  166.  
  167. void p4_1() {
  168.     const double h= 0.1;
  169.     double y1 = 1;
  170.     double y2 = 0;
  171.     double y1_prev = y1;
  172.     double y2_prev = y2;
  173.     printf("t, y1, y2\n");
  174.     for (double t= 0; t<=3.1; t+=h) {
  175.         printf("%g %g %g\n", t, y1 ,y2);
  176.         y1 = y2_prev * h + y1_prev;
  177.         y2 = h * (-0.1*y2_prev -y1_prev) + y2_prev;
  178.         y1_prev = y1;
  179.         y2_prev = y2;
  180.     }
  181. }
  182.  
  183.  
  184. void p4_2() {
  185.     const double h= 0.1;
  186.     double y1 = 1;
  187.     double y2 = 0;
  188.     printf("t, y1, y2\n");
  189.     VEC Y(2);
  190.     MAT A(2);
  191.     VEC Y_n(2);
  192.     Y[0] = Y_n[0] = 1;
  193.     Y[1] = Y_n[1] = 0;
  194.     for (double t= 0; t<=3.1; t+=h) {
  195.         printf("%g %g %g\n", t, Y[0], Y[1]);
  196.         A[0][0] = 1.0 / h;
  197.         A[0][1] = -1.0 / 2;
  198.         A[1][0] = 1.0 / 2;
  199.         A[1][1] = 1.0/h + 0.1 / 2;
  200.         Y[0] = Y[0] / h + 1.0 / 2 * Y[1];
  201.         Y[1] = Y[1] / h - 0.1 / 2 * Y[1] - Y[0]/2;
  202.         Y_n = LU_fact_and_solve(A, Y);
  203.         Y = Y_n;
  204.     }
  205. }
  206. int main() {
  207.     //cout << bisection(1e-10, 5, 1e-12, 5000, fn6) << endl;
  208.     p4_2();
  209.  
  210.     return 0;
  211. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement