RK

//IEulerRK.cpp--Improved Euler and Runge-Kutta(4)
//qiu changweifen fangcheng shuzhijie
#include < stdio.h > 
#include < math.h > 
#define FMT "%-15.7g"
typedef double dbl;
//prototypes
dbl fxy(dbl x, dbl y);
dbl f(dbl x);
void RK(dbl x0, dbl y0, dbl b, dbl h);
int main() {
    printf("\nRunge-Kutta:\nh=0.1:\n");
    RK(0.0, 1.0 / 3.0, 1.0, 0.1);
    printf("\nh=0.025:\n");
    RK(0.0, 1.0 / 3.0, 1.0, 0.025);
    printf("\nh=0.01:\n");
    RK(0.0, 1.0 / 3.0, 1.0, 0.01);
    return 0;
}
dbl fxy(dbl x, dbl y) {
    return ( - 50 * y + 50 * x * x + 2 * x);
}
dbl f(dbl x) {
    return (exp( - 50 * x) / 3.0 + x * x);
}
void RK(dbl x0, dbl y0, dbl b, dbl h) {
    dbl k1,
    k2,
    k3,
    k4;
    dbl xn,
    yn;
    printf("xn             yn             y(xn)          \n");
    xn = x0;
    yn = y0;
    while (xn <= b - 1e-7) {
        k1 = fxy(xn, yn);
        k2 = fxy(xn + h / 2.0, yn + k1 * h / 2.0);
        k3 = fxy(xn + h / 2.0, yn + k2 * h / 2.0);
        k4 = fxy(xn + h, yn + k3 * h);
        yn = yn + (k1 + 2 * k2 + 2 * k3 + k4) * h / 6;
        xn += h;
        printf(FMT, xn);
        printf(FMT, yn);
        printf(FMT, f(xn));
        printf("\n");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值