2019年4月28日 星期日

C語言 例題5-3 利用Euler修正法求ODE y' = y -2x^2 +1 , y(1) = ?

Euler修正法 
For a given differential equation \frac{dy}{dx}=f(x, y) with initial condition y(x_0)=y_0
find the approximate solution using Predictor-Corrector method.
Predictor-Corrector Method :
The predictor-corrector method is also known as Modified-Euler method.
In the Euler method, the tangent is drawn at a point and slope is calculated for a given step size. Thus this method works best with linear functions, but for other cases, there remains a truncation error. To solve this problem the Modified Euler method is introduced. In this method instead of a point, the arithmetic average of the slope over an interval (x_t, x_{t+1}) is used.
Thus in the Predictor-Corrector method for each step the predicted value of y_{t+1}is calculated first using Euler’s method and then the slopes at the points (x_t, y_t)and (x_{t+1}, y_{t+1}) is calculated and the arithmetic average of these slopes are added to y_t to calculate the corrected value of y_{t+1}.
So,
  • Step – 1 : First the value is predicted for a step(here t+1) :y_{t+1, p} = y_t + h*f(x_t, y_t),
    here h is step size for each increment
  • Step – 2 : Then the predicted value is corrected :y_{t+1, c} = y_t + h*\frac{f(x_t, y_t)+f(x_{t+1}, y_{t+1, p})}{2}
  • Step – 3 : The incrementation is done :x_{t+1}=x_t+h, t=t+1
  • Step – 4 : Check for continuation, if x_{t}<x_{n} then go to step – 1.
  • Step – 5 : Terminate the process.
  • As, in this method, the average slope is used, so the error is reduced significantly. Also, we can repeat the process of correction for convergence. Thus at every step, we are reducing the error thus by improving the value of y.

    Input : eq = \frac {dy}{dx} = y-2x^2+1, y(0) = 0.5, step size(h) = 0.2
    To find: y(1) 
    Output: y(1) = 2.18147

    // C++ code for solving the differential equation 
    // using Predictor-Corrector or Modified-Euler method 
    // with the given conditions, y(0) = 0.5, step size(h) = 0.2 
    // to find y(1) 
      
    #include <bits/stdc++.h> 
    using namespace std; 
      
    // consider the differential equation 
    // for a given x and y, return v 
    double f(double x, double y) 
        double v = y - 2 * x * x + 1; 
        return v; 
      
    // predicts the next value for a given (x, y) 
    // and step size h using Euler method 
    double predict(double x, double y, double h) 
        // value of next y(predicted) is returned 
        double y1p = y + h * f(x, y); 
        return y1p; 
      
    // corrects the predicted value 
    // using Modified Euler method 
    double correct(double x, double y, 
                   double x1, double y1, 
                   double h) 
        // (x, y) are of previous step 
        // and x1 is the increased x for next step 
        // and y1 is predicted y for next step 
        double e = 0.00001; 
        double y1c = y1; 
      
        do { 
            y1 = y1c; 
            y1c = y + 0.5 * h * (f(x, y) + f(x1, y1)); 
        } while (fabs(y1c - y1) > e); 
      
        // every iteration is correcting the value 
        // of y using average slope 
        return y1c; 
      
    void printFinalValues(double x, double xn, 
                          double y, double h) 
      
        while (x < xn) { 
            double x1 = x + h; 
            double y1p = predict(x, y, h); 
            double y1c = correct(x, y, x1, y1p, h); 
            x = x1; 
            y = y1c; 
        } 
      
        // at every iteration first the value 
        // of for next step is first predicted 
        // and then corrected. 
        cout << "The final value of y at x = "
             << x << " is : " << y << endl; 
      
    int main() 
        // here x and y are the initial 
        // given condition, so x=0 and y=0.5 
        double x = 0, y = 0.5; 
      
        // final value of x for which y is needed 
        double xn = 1; 
      
        // step size 
        double h = 0.2; 
      
        printFinalValues(x, xn, y, h); 
      
        return 0; 
    }

    輸出畫面
    The final value of y at x = 1 is : 2.18147                                                                                     ...Program finished with exit code 0                                                                                                                          
    Press ENTER to exit console.                                                                                                      
    C語言
    // C code for solving the differential equation 
    // using Predictor-Corrector or Modified-Euler method 
    // with the given conditions, y(0) = 0.5, step size(h) = 0.2 
    // to find y(1) 
      
    #include <stdio.h>
    #include <math.h>

    // consider the differential equation 
    // for a given x and y, return v 
    double f(double x, double y) 
        double v = y - 2 * x * x + 1; 
        return v; 
      
    // predicts the next value for a given (x, y) 
    // and step size h using Euler method 
    double predict(double x, double y, double h) 
        // value of next y(predicted) is returned 
        double y1p = y + h * f(x, y); 
        return y1p; 
      
    // corrects the predicted value 
    // using Modified Euler method 
    double correct(double x, double y, double x1, double y1,double h) 
        // (x, y) are of previous step 
        // and x1 is the increased x for next step 
        // and y1 is predicted y for next step 
        double e = 0.00001; 
        double y1c = y1; 
      
        do { 
            y1 = y1c; 
            y1c = y + 0.5 * h * (f(x, y) + f(x1, y1)); 
        } while (fabs(y1c - y1) > e); 
      
        // every iteration is correcting the value 
        // of y using average slope 
        return y1c; 
      
    void printFinalValues(double x, double xn, double y, double h) 
      
        while (x < xn) { 
            double x1 = x + h; 
            double y1p = predict(x, y, h); 
            double y1c = correct(x, y, x1, y1p, h); 
            x = x1; 
            y = y1c; 
        } 
      
        // at every iteration first the value 
        // of for next step is first predicted 
        // and then corrected. 
        printf("The final value of y  , at x = %2.4lf is :%2.4lf " ,x ,y); 
      
    int main() 
        // here x and y are the initial 
        // given condition, so x=0 and y=0.5 
        double x = 0, y = 0.5; 
      
        // final value of x for which y is needed 
        double xn = 1; 
      
        // step size 
        double h = 0.2; 
      
        printFinalValues(x, xn, y, h); 
      
        return 0; 
    }
                                
                                   

    沒有留言:

    張貼留言

    2024_09 作業3 以Node-Red 為主

     2024_09 作業3  (以Node-Red 為主  Arduino 可能需要配合修改 ) Arduino 可能需要修改的部分 1)mqtt broker  2) 主題Topic (發行 接收) 3) WIFI ssid , password const char br...