adams预测-校正系统

这个程序是大学三年级学习《数值分析》的时候写的程序,计算机以数学作为基础,很好的了解数有助于我们学习程序设计。

#include<iostream.h>
#include<iomanip.h>
#include<math.h>
#include<stdio.h>
#define M 80
double f(double,double);
//void runge4(double,double,double,double,double);
void runge4(double a,double b,double rk[],double h,double x[])
{
    int k,max;
 double k1,k2,k3,k4;
 max=(int)((b-a)/h);
 x[0]=a;
 for(k=1;k<=max;k++)//runge-kutta
 {
        x[k]=x[k-1]+h;
  k1=f(x[k-1],rk[k-1]);
  k2=f((x[k-1]+h*0.5),(rk[k-1]+h*0.5*k1));
  k3=f((x[k-1]+h*0.5),(rk[k-1]+h*0.5*k2));
  k4=f((x[k-1]+h),(rk[k-1]+h*k3));
  rk[k]=rk[k-1]+h*(k1+2*k2+2*k3+k4)/6;
 }
}
void main()
{
 double x[M]={0.0},a,b,h,y[M]={0.0},k[5],y0;
 int n,i,m;
 cout<<"

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用 MATLAB 实现 Aitken 加速、改进欧拉方法、经典龙格库塔方法(四阶)、阿达姆斯预测-校正方法的代码: Aitken 加速: ```matlab function [x, iter] = aitken(f, x0, tol, maxiter) % Aitken 加速求解非线性方程 f(x) = 0 % f: 方程右端函数 % x0: 初值 % tol: 允许误差 % maxiter: 最大迭代步数 % x: 近似解 % iter: 实际迭代步数 iter = 0; x = x0; while iter < maxiter iter = iter + 1; fx = f(x); if abs(fx) < tol return; end x1 = x - fx; fx1 = f(x1); if abs(fx1) < tol x = x1; return; end x2 = x1 - fx1; fx2 = f(x2); if abs(fx2) < tol x = x2; return; end x = x - fx * fx / (fx1 - 2 * fx + fx2); end end ``` 改进欧拉方法: ```matlab function [t, y] = improve_euler(f, a, b, y0, h) % 改进欧拉方法求解常微分方程初值问题 y' = f(t, y), y(a) = y0 % f: 方程右端函数 % a, b: 区间端点 % y0: 初值 % h: 步长 % t: 网格点 % y: 近似解 t = a:h:b; y = zeros(1, length(t)); y(1) = y0; for i = 1:length(t)-1 y1 = y(i) + h * f(t(i), y(i)); y(i+1) = y(i) + h / 2 * (f(t(i), y(i)) + f(t(i+1), y1)); end end ``` 经典龙格库塔方法(四阶): ```matlab function [t, y] = rk4(f, a, b, y0, h) % 经典龙格库塔方法(四阶)求解常微分方程初值问题 y' = f(t, y), y(a) = y0 % f: 方程右端函数 % a, b: 区间端点 % y0: 初值 % h: 步长 % t: 网格点 % y: 近似解 t = a:h:b; y = zeros(1, length(t)); y(1) = y0; for i = 1:length(t)-1 k1 = f(t(i), y(i)); k2 = f(t(i) + h/2, y(i) + h/2 * k1); k3 = f(t(i) + h/2, y(i) + h/2 * k2); k4 = f(t(i) + h, y(i) + h * k3); y(i+1) = y(i) + h/6 * (k1 + 2*k2 + 2*k3 + k4); end end ``` 阿达姆斯预测-校正方法: ```matlab function [t, y] = adams(f, a, b, y0, h) % 阿达姆斯预测-校正方法求解常微分方程初值问题 y' = f(t, y), y(a) = y0 % f: 方程右端函数 % a, b: 区间端点 % y0: 初值 % h: 步长 % t: 网格点 % y: 近似解 n = round((b-a)/h); t = a:h:a+n*h; y = zeros(1, length(t)); y(1:4) = rk4(f, a, a+3*h, y0, h); for i = 4:n yp = y(i) + h/24 * (55*f(t(i), y(i)) - 59*f(t(i-1), y(i-1)) + 37*f(t(i-2), y(i-2)) - 9*f(t(i-3), y(i-3))); ypp = y(i) + h/24 * (9*f(t(i+1), yp) + 19*f(t(i), y(i)) - 5*f(t(i-1), y(i-1)) + f(t(i-2), y(i-2))); while abs(ypp - yp) > 1e-6 yp = ypp; ypp = y(i) + h/24 * (9*f(t(i+1), yp) + 19*f(t(i), y(i)) - 5*f(t(i-1), y(i-1)) + f(t(i-2), y(i-2))); end y(i+1) = ypp; end end ``` 以上代码仅供参考,实际使用时需要根据具体问题进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值