修改rk4方法的C实现
坦率地说,我的问题是,我不确定这是怎么回事 我需要修改double f()函数来解决任意 微分方程d2θ/dt2=−ω2sinθ,但我不确定如何继续 我理解rk4函数runge4()本身;我不明白的是 函数的作用是:返回谐振子的正确值 有人能至少解释一下f()函数背后的逻辑吗 原始代码如下修改rk4方法的C实现,c,math,physics,numerical-methods,C,Math,Physics,Numerical Methods,坦率地说,我的问题是,我不确定这是怎么回事 我需要修改double f()函数来解决任意 微分方程d2θ/dt2=−ω2sinθ,但我不确定如何继续 我理解rk4函数runge4()本身;我不明白的是 函数的作用是:返回谐振子的正确值 有人能至少解释一下f()函数背后的逻辑吗 原始代码如下 /* ************************************************************************ * rk4.c: 4th order Runge-K
/*
************************************************************************
* rk4.c: 4th order Runge-Kutta solution for harmonic oscillator *
* *
* From: "A SURVEY OF COMPUTATIONAL PHYSICS"
by RH Landau, MJ Paez, and CC BORDEIANU
Copyright Princeton University Press, Princeton, 2008.
Electronic Materials copyright: R Landau, Oregon State Univ, 2008;
MJ Paez, Univ Antioquia, 2008; & CC BORDEIANU, Univ Bucharest, 2008
Support by National Science Foundation
*
************************************************************************
*/
#include <stdio.h>
#define N 2 /* number of equations */
#define dist 0.1 /* stepsize */
#define MIN 0.0 /* minimum x */
#define MAX 10.0 /* maximum x */
void runge4(double x, double y[], double step);
double f(double x, double y[], int i);
int main()
{
double x, y[N];
int j;
FILE *output; /* save data in rk4.dat */
output = fopen("rk4.dat","w");
y[0] = 1.0; /* initial position */
y[1] = 0.0; /* initial velocity */
fprintf(output, "%f\t%f\n", x, y[0]);
for(x = MIN; x <= MAX ; x += dist)
{
runge4(x, y, dist);
fprintf(output, "%f\t%f\n", x, y[0]); /* position vs. time */
}
printf("data stored in rk4.dat\n");
fclose(output);
}
/*-----------------------end of main program--------------------------*/
/* Runge-Kutta subroutine */
void runge4(double x, double y[], double step)
{
double h=step/2.0, /* the midpoint */
t1[N], t2[N], t3[N], /* temporary storage */
k1[N], k2[N], k3[N],k4[N]; /* for Runge-Kutta */
int i;
for (i=0; i<N; i++) t1[i] = y[i]+0.5*(k1[i]=step*f(x, y, i));
for (i=0; i<N; i++) t2[i] = y[i]+0.5*(k2[i]=step*f(x+h, t1, i));
for (i=0; i<N; i++) t3[i] = y[i]+ (k3[i]=step*f(x+h, t2, i));
for (i=0; i<N; i++) k4[i] = step*f(x + step, t3, i);
for (i=0; i<N; i++) y[i] += (k1[i]+2*k2[i]+2*k3[i]+k4[i])/6.0;
}
/*--------------------------------------------------------------------*/
/* definition of equations - this is the harmonic oscillator */
double f(double x, double y[], int i)
{
if (i == 0) return(y[1]); /* RHS of first equation */
if (i == 1) return(-y[0]); /* RHS of second equation */
}
/*
************************************************************************
*rk4.c:谐振子的四阶Runge-Kutta解*
* *
*摘自:“计算物理概览”
作者:RH Landau、MJ Paez和CC BORDEIANU
版权所有普林斯顿大学出版社,普林斯顿,2008年。
电子材料版权所有:R Landau,俄勒冈州州立大学,2008年;
安蒂奥基亚大学MJ Paez,2008年CC BORDEIANU,布加勒斯特大学,2008年
国家科学基金资助
*
************************************************************************
*/
#包括
#定义N 2/*个方程式*/
#定义距离0.1/*步长*/
#定义最小值0.0/*最小值x*/
#定义最大值10.0/*最大值x*/
空心梯级4(双x,双y[],双台阶);
双f(双x,双y[],整数i);
int main()
{
双x,y[N];
int j;
文件*输出;/*将数据保存在rk4.dat中*/
输出=fopen(“rk4.dat”,“w”);
y[0]=1.0;/*初始位置*/
y[1]=0.0;/*初始速度*/
fprintf(输出,“%f\t%f\n”,x,y[0]);
对于(x=MIN;xN被定义为常数2。这意味着这些循环将进行2次迭代,i=0
和i=1
如果i==0
函数将返回传入的多项式的第二个元素,如果i==1
函数将返回该多项式的第一个元素的负数
我不知道获得谐振子的公式(老实说,这听起来像是Georgdi LaForge会说需要重新校准或什么的),但我假设它就是这样。N被定义为常数2。这意味着这些循环将进行2次迭代,I=0
和I=1
如果i==0
函数将返回传入的多项式的第二个元素,如果i==1
函数将返回该多项式的第一个元素的负数
我不知道获得谐振子的公式(老实说,这听起来像是Georgi LaForge说的需要重新校准或其他什么),但我假设就是这样。从胡克定律开始:
F = -kx
结合牛顿第二定律,得到线性谐振子的微分方程:
ma = F = -kx
mx'' = -kx
x'' = -k/m x
任意选择我们的单位,使k/m==1
,方程式变成:
x'' = -x
现在,引入一个虚拟变量y=x'
,将这个二阶微分方程写成一个二维一阶系统:
x' = y
y' = -x
代码中的函数f
正是对这个系统进行编码的;为了清晰起见,我将更改变量名称:
double f(double t, double v[], int i)
{
if (i == 0) return(v[1]);
if (i == 1) return(-v[0]);
}
v
是来自上述二维系统的向量[x,y]
。给定i
、t
和v
,函数f
返回与i
第v
的th分量的导数。使用这些名称重新编写二维系统,我们得到:
dv[0]/dt = v[1]
dv[1]/dt = -v[0]
这正是函数f所做的。从胡克定律开始:
F = -kx
结合牛顿第二定律,得到线性谐振子的微分方程:
ma = F = -kx
mx'' = -kx
x'' = -k/m x
任意选择我们的单位,使k/m==1
,方程式变成:
x'' = -x
现在,引入一个虚拟变量y=x'
,将这个二阶微分方程写成一个二维一阶系统:
x' = y
y' = -x
代码中的函数f
正是对这个系统进行编码的;为了清晰起见,我将更改变量名称:
double f(double t, double v[], int i)
{
if (i == 0) return(v[1]);
if (i == 1) return(-v[0]);
}
v
是来自上述二维系统的向量[x,y]
。给定i
、t
和v
,函数f
返回与i
第v
的th分量的导数。使用这些名称重新编写二维系统,我们得到:
dv[0]/dt = v[1]
dv[1]/dt = -v[0]
这正是函数f
所做的。注意:我假设y
参数是多项式。我可能弄错了。注意:我假设y
参数是多项式。我可能弄错了。