Solve the differential equation. dy/dx=xz+1, dz/dx=-xy for x=0.3 given that y=0 and z=1 when x=0 using runge kutta method of order four. I am unable to start this problem. Please help. I require mathematical solution using numerical analysis not the programming one.
问问题
469 次
1 回答
1
从经典的数字食谱文本http://www.aip.de/groups/soe/local/numres/bookcpdf/c16-1.pdf:
四阶龙格-库塔法。在每个步骤中,导数被评估四次:一次在初始点,两次在试验中点,一次在试验终点。从这些导数中计算出最终的函数值。
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);
}
这应该让你开始。希望能帮助到你。
于 2016-10-10T20:50:07.680 回答