数值方法runge kutta

时间:2016-10-10 19:37:11

标签: numerical-methods numerical-integration numerical-analysis runge-kutta

求解微分方程。 dy / dx = xz + 1,dz / dx = -xy对于x = 0.3,假设y = 0且当x = 0时z = 1,使用4阶的runge kutta方法。我无法解决这个问题。请帮忙。我需要使用数值分析而不是编程的数学解决方案。

1 个答案:

答案 0 :(得分:1)

来自经典的数字食谱文本http://www.aip.de/groups/soe/local/numres/bookcpdf/c16-1.pdf

四阶Runge-Kutta方法。在每个步骤中,衍生物被评估四次:一次在初始点,两次在试验中点,一次在试验终点。根据这些导数计算最终函数值。

k1 = hf(xn, yn) 
k2 = hf(xn + h/2 , yn + k1/2 )
k3 = hf(xn + h/2 , yn + k2/2 )
k4 = hf(xn + h, yn + k3) 
yn+1 = yn + k1/6 + k2/3 + k3/3 + k4/6 + O(h^5)

C:

中的示例
#include “nrutil.h"
float **y,*xx;
void rkdumb(float vstart[], int nvar, float x1, float x2, int nstep, void (*derivs)(float, float [], float []))
{
    void rk4(float y[], float dydx[], int n, float x, float h, float yout[], void (*derivs)(float, float [], float []));
    int i,k;
    float x,h;
    float *v,*vout,*dv;
    v=vector(1,nvar);
    vout=vector(1,nvar);
    dv=vector(1,nvar);
    for (i=1;i<=nvar;i++) { 
        v[i]=vstart[i];
        y[i][1]=v[i];
    }
    xx[1]=x1;
    x=x1; 
    h=(x2-x1)/nstep; 
    for (k=1;k<=nstep;k++) {
        (*derivs)(x,v,dv);
        rk4(v,dv,nvar,x,h,vout,derivs);
        if ((float)(x+h) == x) 
            nrerror("Step size too small in routine rkdumb”);
        x += h;
        xx[k+1]=x; 
        for (i=1;i<=nvar;i++) {
            v[i]=vout[i]; y[i][k+1]=v[i]; 
        } 
    } 
    free_vector(dv,1,nvar); 
    free_vector(vout,1,nvar);
    free_vector(v,1,nvar); 
}

这应该让你开始。希望它有所帮助。