常微分方程算法之编程示例五(阿当姆斯法)

目录

一、研究问题

二、C++代码

三、计算结果


一、研究问题

本节我们采用阿当姆斯法(Adams法)求解算例。

阿当姆斯法的原理及推导请参考:

常微分方程算法之阿当姆斯法(Adams法)_四步四阶adams显格式;三步四阶adams隐格式;四阶adams预估-校正格式-CSDN博客https://blog.csdn.net/L_peanut/article/details/137378532 研究问题依然为

取步长为0.1。已知精确解为

二、C++代码

这里我们使用四阶阿当姆斯显格式四阶阿当姆斯预估-校正格式进行求解,如下:


cpp 复制代码
#include <cmath>
#include <stdlib.h>
#include <stdio.h>


int main(int argc, char *argv[])
{
        int i,N;
        double a,b,h,k1,k2,k3,k4,upredict;
        double *x,*y,*u;
        double f(double x, double y);
        double exact(double x);

        a=0.0;
        b=1.0;
        N=10;
        h=(b-a)/N;

        x=(double *)malloc(sizeof(double)*(N+1));
        y=(double *)malloc(sizeof(double)*(N+1));
        u=(double *)malloc(sizeof(double)*(N+1));
        for(i=0;i<=N;i++)
                x[i]=a+i*h;
        y[0]=1.0;
        u[0]=1.0;

        for(i=0;i<=2;i++)  //用龙格-库塔法求解y1,y2,y3作为初始值
        {
                k1=h*f(x[i],y[i]);
                k2=h*f(x[i]+0.5*h,y[i]+0.5*k1);
                k3=h*f(x[i]+0.5*h,y[i]+0.5*k2);
                k4=h*f(x[i]+h,y[i]+k3);
                y[i+1]=y[i]+(k1+2*k2+2*k3+k4)/6.0;
                u[i+1]=y[i+1];
        }

        for(i=3;i<N;i++)
        {
                //四阶阿当姆斯显格式
                y[i+1]=y[i]+(55*f(x[i],y[i])-59*f(x[i-1],y[i-1])+37*f(x[i-2],y[i-2])-9*f(x[i-3],y[i-3]))*h/24.0;
                //四阶阿当姆斯预估-校正格式
                upredict=u[i]+(55*f(x[i],u[i])-59*f(x[i-1],u[i-1])+37*f(x[i-2],u[i-2])-9*f(x[i-3],u[i-3]))*h/24.0;
                u[i+1]=u[i]+(9*f(x[i+1],upredict)+19*f(x[i],u[i])-5*f(x[i-1],u[i-1])+f(x[i-2],u[i-2]))*h/24.0;
        }

        for(i=0;i<=N;i++)
                printf("x=%.2f, 显示解=%f, 预估-校正解=%f, exact=%f.\n",x[i],y[i],u[i],exact(x[i]));

        free(x);free(y);free(u);

        return 0;
}



double f(double x, double y)
{
        return y-2*x/y;
}
double exact(double x)
{
        return sqrt(1+2.0*x);
}
                                            

三、计算结果

bash 复制代码
x=0.00, 显示解=1.000000, 预估-校正解=1.000000, exact=1.000000.
x=0.10, 显示解=1.095446, 预估-校正解=1.095446, exact=1.095445.
x=0.20, 显示解=1.183217, 预估-校正解=1.183217, exact=1.183216.
x=0.30, 显示解=1.264912, 预估-校正解=1.264912, exact=1.264911.
x=0.40, 显示解=1.341552, 预估-校正解=1.341641, exact=1.341641.
x=0.50, 显示解=1.414046, 预估-校正解=1.414214, exact=1.414214.
x=0.60, 显示解=1.483019, 预估-校正解=1.483240, exact=1.483240.
x=0.70, 显示解=1.548919, 预估-校正解=1.549193, exact=1.549193.
x=0.80, 显示解=1.612116, 预估-校正解=1.612452, exact=1.612452.
x=0.90, 显示解=1.672917, 预估-校正解=1.673320, exact=1.673320.
x=1.00, 显示解=1.731570, 预估-校正解=1.732051, exact=1.732051.

从计算结果可知,预估-校正法求解结果有效数字更多,结果更为精确,优于显示法。

相关推荐
前进之路911 分钟前
Leetcode每日一练--35
算法·leetcode
董建光d20 分钟前
【深度学习】目标检测全解析:定义、数据集、评估指标与主流算法
深度学习·算法·目标检测
郝学胜-神的一滴32 分钟前
Linux系统函数link、unlink与dentry的关系及使用注意事项
linux·运维·服务器·开发语言·前端·c++
赵杰伦cpp34 分钟前
list的迭代器
开发语言·数据结构·c++·算法·链表·list
~~李木子~~43 分钟前
机器学习集成算法实践:装袋法与提升法对比分析
人工智能·算法·机器学习
老歌老听老掉牙1 小时前
使用 OpenCASCADE 提取布尔运算后平面图形的外轮廓
c++·平面·opencascade
微笑尅乐1 小时前
三种思路彻底掌握 BST 判断(递归与迭代全解析)——力扣98.验证二叉搜索树
算法·leetcode·职场和发展
闻缺陷则喜何志丹1 小时前
【动态规划】数位DP的原理、模板(封装类)
c++·算法·动态规划·原理·模板·数位dp
豆沙沙包?1 小时前
2025年--Lc194-516. 最长回文子序列(动态规划在字符串的应用,需要二刷)--Java版
java·算法·动态规划
胖咕噜的稞达鸭2 小时前
二叉树搜索树插入,查找,删除,Key/Value二叉搜索树场景应用+源码实现
c语言·数据结构·c++·算法·gitee