龙格库塔法的c++编程
#include<stdlib.h>#include<stdio.h>
/*n表示几等分,n+1表示他输出的个数*/
int RungeKutta(double y0,double a,double b,int n,double *x,double *y,int style,double (*function)(double,double))
{
double h=(b-a)/n,k1,k2,k3,k4;
int i;
// x=(double*)malloc((n+1)*sizeof(double));
// y=(double*)malloc((n+1)*sizeof(double));
x=a;
y=y0;
switch(style)
{
case 2:
for(i=0;i<n;i++)
{
x=x+h;
k1=function(x,y);
k2=function(x+h/2,y+h*k1/2);
y=y+h*k2;
}
break;
case 3:
for(i=0;i<n;i++)
{
x=x+h;
k1=function(x,y);
k2=function(x+h/2,y+h*k1/2);
k3=function(x+h,y-h*k1+2*h*k2);
y=y+h*(k1+4*k2+k3)/6;
}
break;
case 4:
for(i=0;i<n;i++)
{
x=x+h;
k1=function(x,y);
k2=function(x+h/2,y+h*k1/2);
k3=function(x+h/2,y+h*k2/2);
k4=function(x+h,y+h*k3);
y=y+h*(k1+2*k2+2*k3+k4)/6;
}
break;
default:
return 0;
}
return 1;
}
double function(double x,double y)
{
return y-2*x/y;
}
//例子求y'=y-2*x/y(0<x<1);y0=1;
/*
int main()
{
double x,y;
printf("用二阶龙格-库塔方法\n");
RungeKutta(1,0,1,5,x,y,2,function);
for(int i=0;i<6;i++)
printf("x[%d]=%f,y[%d]=%f\n",i,x,i,y);
printf("用三阶龙格-库塔方法\n");
RungeKutta(1,0,1,5,x,y,3,function);
for(i=0;i<6;i++)
printf("x[%d]=%f,y[%d]=%f\n",i,x,i,y);
printf("用四阶龙格-库塔方法\n");
RungeKutta(1,0,1,5,x,y,4,function);
for(i=0;i<6;i++)
printf("x[%d]=%f,y[%d]=%f\n",i,x,i,y);
return 1;
谢谢!
呵呵
还可以,简单点,如果中间加一个迭代 原帖由 lzh316 于 2007-1-22 19:40 发表还可以,简单点,如果中间加一个迭代
你说的中间加一个迭代是什么意思? 原帖由 lzh316 于 2007-1-22 19:40 发表
还可以,简单点,如果中间加一个迭代
一般这类算法已经很少自己写程序了,大部分在算法库中都能够找到
这个什么龙格库塔法不怎么会用
有没有谁会编个二阶用龙格库塔法解非线性微分方程的程序给我看看,用matlab语言的,方程是d2θe(t)/dt2+(1/τ1+K*(τ2/τ1)*cosθe(t))* dθe(t)/dt+k/τ1*sinθe(t)-△ω0/τ1=0 原帖由 insects 于 2007-5-16 10:25 发表
有没有谁会编个二阶用龙格库塔法解非线性微分方程的程序给我看看,用matlab语言的,方程是
d2θe(t)/dt2+(1/τ1+K*(τ2/τ1)*cosθe(t))* dθe(t)/dt+k/τ1*sinθe(t)-△ω0/τ1=0
把你的方程转换到状态空间就可以了
注意版规:Matlab问题请到Matlab讨论区发帖询问 有没有谁会用VC编的啊 原帖由 sssssxxxxx921 于 2007-7-10 21:13 发表
有没有谁会用VC编的啊
什么意思?上面的代码稍加修改就能在VC下运行 (用C/C++)用龙格库塔法如何编程微分方程组dx/dt=-10x+10y dy/dt=30x-y-xz dz/dt=(-8/3)z+xy求大神帮忙 dx/dt=-10x+10y dy/dt=30x-y-xz dz/dt=(-8/3)z+xy
页:
[1]