龍格演算法
① 求一個用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[0]=a;
y[0]=y0;
switch(style)
{
case 2:
for(i=0;i<n;i++)
{
x[i+1]=x[i]+h;
k1=function(x[i],y[i]);
k2=function(x[i]+h/2,y[i]+h*k1/2);
y[i+1]=y[i]+h*k2;
}
break;
case 3:
for(i=0;i<n;i++)
{
x[i+1]=x[i]+h;
k1=function(x[i],y[i]);
k2=function(x[i]+h/2,y[i]+h*k1/2);
k3=function(x[i]+h,y[i]-h*k1+2*h*k2);
y[i+1]=y[i]+h*(k1+4*k2+k3)/6;
}
break;
case 4:
for(i=0;i<n;i++)
{
x[i+1]=x[i]+h;
k1=function(x[i],y[i]);
k2=function(x[i]+h/2,y[i]+h*k1/2);
k3=function(x[i]+h/2,y[i]+h*k2/2);
k4=function(x[i]+h,y[i]+h*k3);
y[i+1]=y[i]+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[6],y[6];
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],i,y[i]);
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],i,y[i]);
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],i,y[i]);
return 1;
}
② 龍格庫塔法的基本原理
該演算法是構建在數學支持的基礎之上的。對於一階精度的拉格朗日中值定理有:
對於微分方程:y'=f(x,y)
y(i+1)=y(i)+h*K1
K1=f(xi,yi)
當用點xi處的斜率近似值K1與右端點xi+1處的斜率K2的算術平均值作為平均斜率K*的近似值,那麼就會得到二階精度的改進拉格朗日中值定理:
y(i+1)=y(i)+[h*( K1+ K2)/2]
K1=f(xi,yi)
K2=f(x(i)+h,y(i)+h*K1)
依次類推,如果在區間[xi,xi+1]內多預估幾個點上的斜率值K1、K2、……Km,並用他們的加權平均數作為平均斜率K*的近似值,顯然能構造出具有很高精度的高階計算公式。經數學推導、求解,可以得出四階龍格-庫塔公式,也就是在工程中應用廣泛的經典龍格-庫塔演算法:
y(i+1)=y(i)+h*( K1+ 2*K2 +2*K3+ K4)/6
K1=f(x(i),y(i))
K2=f(x(i)+h/2,y(i)+h*K1/2)
K3=f(x(i)+h/2,y(i)+h*K2/2)
K4=f(x(i)+h,y(i)+h*K3)
通常所說的龍格-庫塔法是指四階而言的,我們可以仿二階、三階的情形推導出常用的標准四階龍格-庫塔法公式
③ 龍格-庫塔-芬爾格演算法是什麼演算法解決什麼問題的
龍格-庫塔法是求解一階線性微分方程組的一種數值演算法。
④ VC++、C語言大神們,拉格朗日插值演算法的龍格現象怎麼破!多謝了!
演算法其實不用怎麼學習,經典的演算法要記一下,比如各種排序的演算法。具體用的時候去網上找就行了,因為很多問題的演算法我們個人要搞出來真的是很費勁,所以比較經典的演算法要記下來,不用過分糾結於這個問題,拿到演算法你能把他們轉化為代碼就行了。
因為編程的技術牽扯的太多你不用都過分糾結,有些你會用就行了。
⑤ 自己編寫龍格庫塔演算法求解二階常微分方程10x′′ − 7x′ + 4x =10sin(t) ,x(0)=4,x'(0)=9
function [Y] = RK45(t,X,f,h)
K1=f(t,X);
K2=f(t+h/2,X+h/2*K1);
K3=f(t+h/2,X+h/2*K2);
K4=f(t+h,X+h*K3);
Y=X+h/6*(K1+2*K2+2*K3+K4);
end
以上是4階龍格庫塔法的代碼:
自己寫函數,存為f.m
function dxdt = f (t,x)
dxdt(1)=exp(x(1)*sin(t))+x(2);
dxdt(2)=exp(x(2)*cos(t))+x(1); % x(1)是你的f,x(2)是你的g
dxdt=dxdt(:);
end
自己給出t0,x0,h的值(初始時間,初值,步長)
如果求t0到t1的軌跡的話:給個例子如下
t0=0;t1=5;h=0.02;x0=[-1;-1];
T=t0:h:t1;X=zeros(length(x0),length(T));X(:,1)=x0;
for j=1:length(T)-1
X(:,j+1)=RK45(T(j),X(:,j),@(t,x) f(t,x),h);
end
plot(T,X(1,:));
hold on;
plot(T,X(2,:),'r');
具體參數自己設置
⑥ 誰有求解多自由度動力學方程響應的四階龍格庫塔演算法的matlab程序
可以用ode45求解。需定義mass函數,用以計算質量矩陣,即化為下述形式求解:M(t,y)*dy/dt=f(t,y)。請給出ABCDEF的具體值。
⑦ 用龍格庫塔演算法解二階常微分方程,利用c++編程
另z = y'
原來的方程就可以化簡成以z'和y,x的方程
和y'=z 帶入兩個初始條件,就可以進行迭代了
⑧ 關於matlab 四階龍格庫塔演算法的
上面用的好像不是FFT,應該用的是DCT變換吧。
換上DCT應該相似了。
⑨ matlab四階龍格-庫塔演算法解二階常微分方程程序,最好是可以有詳細解說的,謝謝各位了.例如,
>>dy=inline('[y(2);7*(1-y(1)^2)*y(2)-y(1)]','t','y');
>>ode45(dy,100,[10])
同做畢設的路過,話說畢個業真難
⑩ 龍格庫塔演算法能算邊界條件是任意位置的嗎
龍格-庫塔(Runge-Kutta)方法是一種在工程上應用廣泛的高精度單步演算法,用於數值求解微分方程。由於此演算法精度高,採取措施對誤差進行抑制,所以其實現原理也較復雜。