📜  皮卡德迭代法的程序|计算数学

📅  最后修改于: 2021-09-23 04:41:24             🧑  作者: Mango

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

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

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

Picard 的迭代级数比较容易实现,通过这种数值分析得到的解一般是幂级数

皮卡德迭代法公式:

皮卡德迭代公式。

涉及的步骤:

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

Picard 的迭代示例:
鉴于:

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

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

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

    因此,在 x = 0.3 处,第一次迭代的结果为:

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

    所以,
    这使:

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

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

    所以,
    这使:

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

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

皮卡德迭代法的程序:

// 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

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程