📜  Picard迭代方法的程序|计算数学

📅  最后修改于: 2021-04-24 21:13:05             🧑  作者: Mango

Picard方法是一种迭代方法,主要用于逼近微分方程的解。

这种近似求解微分方程的方法是逐次逼近法之一。也就是说,它是一种迭代方法,其中数值结果使用的次数越多,它的精度就会越来越高。

Picard的迭代方法为微分方程的解提供了一系列的近似值Y1(x),Y2(x),…Yk(x),以便从一个或多个先前的近似值中获得第n个近似值。

Picard的迭代级数比较容易实现,通过此数值分析获得的解通常是幂级数

Picard的迭代方法公式:

Picard的迭代公式。

涉及的步骤:

  • 步骤1:将y的近似值(首先取为常数)代入微分方程的右侧:
    dy / dx = f(x,y)。
  • 步骤2:然后将关于x的方程式进行积分,得到x的y作为第二近似值,将给定的数值替换为x,并将结果四舍五入为指定的小数位数或有效数字。
  • 步骤3:继续进行迭代过程,直到四舍五入到所需的小数位数后,两个连续的数值解都相同。

Picard的迭代示例:
鉴于:

并且当x = 0y = 0 ,当x = 0.3时确定y的值,校正到小数点后四个位。

解决方案:
我们可以进行如下操作:
其中x0 =0。因此:
其中y0 =0。变为:

  • 第一次迭代:
    我们还不知道关于x的y,因此我们在要积分的函数中用常数y0替换y。

    因此,在x = 0.3的情况下,通过以下方式给出第一次迭代的结果:

  • 第二次迭代:
    现在,我们使用:

    所以,
    这使:

    因此,第二次迭代的结果由下式给出:
    在x = 0.3。

  • 第三次迭代:
    现在我们使用:

    所以,
    这使:

    因此,第三次迭代的结果由下式给出:
    在x = 0.3。

  • 因此, y = 0.0451 ,在x = 0.3处校正至小数点后四位。

Picard迭代方法的程序:

// C program for Picard's iterative method
  
#include 
#include 
  
// required macros defined below:
#define Y1(x) (1 + (x) + pow(x, 2) / 2)
#define Y2(x) (1 + (x) + pow(x, 2) / 2 + pow(x, 3) / 3 + pow(x, 4) / 8)
#define Y3(x) (1 + (x) + pow(x, 2) / 2 + pow(x, 3) / 3 + pow(x, 4) / 8 + pow(x, 5) / 15 + pow(x, 6) / 48)
  
int main()
{
    double start_value = 0, end_value = 3,
           allowed_error = 0.4, temp;
    double y1[30], y2[30], y3[30];
    int count;
  
    for (temp = start_value, count = 0;
         temp <= end_value;
         temp = temp + allowed_error, count++) {
  
        y1[count] = Y1(temp);
        y2[count] = Y2(temp);
        y3[count] = Y3(temp);
    }
  
    printf("\nX\n");
    for (temp = start_value;
         temp <= end_value;
         temp = temp + allowed_error) {
  
        // considering all values
        // upto 4 decimal places.
        printf("%.4lf ", temp);
    }
  
    printf("\n\nY(1)\n");
    for (temp = start_value, count = 0;
         temp <= end_value;
         temp = temp + allowed_error, count++) {
  
        printf("%.4lf ", y1[count]);
    }
  
    printf("\n\nY(2)\n");
    for (temp = start_value, count = 0;
         temp <= end_value;
         temp = temp + allowed_error, count++) {
  
        printf("%.4lf ", y2[count]);
    }
  
    printf("\n\nY(3)\n");
    for (temp = start_value, count = 0;
         temp <= end_value;
         temp = temp + allowed_error, count++) {
  
        printf("%.4lf ", y3[count]);
    }
    return 0;
}
输出:
X
0.0000 0.4000 0.8000 1.2000 1.6000 2.0000 2.4000 2.8000 

Y(1)
1.0000 1.4800 2.1200 2.9200 3.8800 5.0000 6.2800 7.7200 

Y(2)
1.0000 1.5045 2.3419 3.7552 6.0645 9.6667 15.0352 22.7205 

Y(3)
1.0000 1.5053 2.3692 3.9833 7.1131 13.1333 24.3249 44.2335