當前位置:首頁 » 編程語言 » C語言龍哥庫塔
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

C語言龍哥庫塔

發布時間: 2022-06-16 16:48:21

㈠ 請用c語言編程龍格庫塔4階公式求,y'=(y-1)/x,步長h=0.05,y(0)=1,的數值解.

師傅告訴對方公司的風格撒法規伍爾特玩兒

㈡ C語言龍格庫塔編程錯誤在哪裡求指正

1、首先這是一個純C的程序,所以你應該使用一個純C的編譯器進行編譯,VC實現的是C++,所以會出現上面的錯誤。我使用gcc編譯運行的結果是: (windows下,你可以使用turbo c來編譯)
t= 0.00 y(0)=-1.000000e+00 y(1)=0.000000e+00 y(2)=1.000000e+00
t= 0.01 y(0)=-9.999500e-01 y(1)=9.999833e-03 y(2)=9.900498e-01
t= 0.02 y(0)=-9.998000e-01 y(1)=1.999867e-02 y(2)=9.801987e-01
t= 0.03 y(0)=-9.995500e-01 y(1)=2.999550e-02 y(2)=9.704455e-01
t= 0.04 y(0)=-9.992001e-01 y(1)=3.998933e-02 y(2)=9.607894e-01
t= 0.05 y(0)=-9.987503e-01 y(1)=4.997917e-02 y(2)=9.512294e-01
t= 0.06 y(0)=-9.982005e-01 y(1)=5.996401e-02 y(2)=9.417645e-01
t= 0.07 y(0)=-9.975510e-01 y(1)=6.994285e-02 y(2)=9.323938e-01
t= 0.08 y(0)=-9.968017e-01 y(1)=7.991469e-02 y(2)=9.231163e-01
t= 0.09 y(0)=-9.959527e-01 y(1)=8.987855e-02 y(2)=9.139312e-01
t= 0.10 y(0)=-9.950042e-01 y(1)=9.983342e-02 y(2)=9.048374e-01

2、如果一定要使用c++,下面是我調試好的程序:(我用g++調通的):

#include "stdio.h"
#include "stdlib.h"

void Func(double * y, double *d)
// double y[],d[];
{
d[0]=y[1]; /*y0'=y1*/
d[1]=-y[0]; /*y1'=y0*/
d[2]=-y[2]; /*y2'=y2*/
return;
}

void RKT(int t, double * y,double n,double h,int k,double * z)
// int n; /*微分方程組中方程的個數,也是未知函數的個數*/
// int k; /*積分的步數(包括起始點這一步)*/
// double t; /*積分的起始點t0*/
// double h; /*積分的步長*/
// double y[]; /*存放n個未知函數在起始點t處的函數值,返回時,其初值在二維數組z的第零列中*/
// double z[]; /*二維數組,體積為n x k.返回k個積分點上的n個未知函數值*/
{
// extern void Func(); /*聲明要求解的微分方程組*/
int i,j,l;
double a[4],*b,*d;
b=(double *)malloc(n*sizeof(double)); /*分配存儲空間*/
if(b == NULL)
{
printf("內存分配失敗\n");
exit(1);
}
d= (double *)malloc(n*sizeof(double)); /*分配存儲空間*/
if(d == NULL)
{
printf("內存分配失敗\n");
exit(1);
}
/*後面應用RK4公式中用到的系數*/
a[0]=h/2.0;
a[1]=h/2.0;
a[2]=h;
a[3]=h;
for(i=0; i<=n-1; i++)
z[i*k]=y[i]; /*將初值賦給數組z的相應位置*/
for(l=1; l<=k-1; l++)
{
Func(y, d);
for (i=0; i<=n-1; i++)
b[i]=y[i];
for (j=0; j<=2; j++)
{
for (i=0; i<=n-1; i++)
{
y[i]=z[i*k+l-1]+a[j]*d[i];
b[i]=b[i]+a[j+1]*d[i]/3.0;
}
Func(y,d);
}
for(i=0; i<=n-1; i++)
y[i]=b[i]+h*d[i]/6.0;
for(i=0; i<=n-1; i++)
z[i*k+l]=y[i];
t=t+h;
}
free(b); /*釋放存儲空間*/
free(d); /*釋放存儲空間*/
return;
}
main()
{
int i,j;
double t,h,y[3],z[3][11];
y[0]=-1.0;
y[1]=0.0;
y[2]=1.0;
t=0.0;
h=0.01;
RKT(t,y,3,h,11,(double *)z);
printf("\n");
for (i=0; i<=10; i++) /*列印輸出結果*/
{
t=i*h;
printf("t=%5.2f\t ",t);
for (j=0; j<=2; j++)
printf("y(%d)=%e ",j,z[j][i]);
printf("\n");
}
}

㈢ C語言:常微分方程初值問題的Taylor求解方法

可以用MATLAB中的函數求解
使用Euler法求解,運算程序簡單,但是計算結果准確度不高。使用改進的Euler法求解過程相對復雜,但是准確度會更高。准確度最高的是四階龍格庫塔法,求解步驟也是最復雜的。問題(1)使用Euler求解,並與准確解對比。問題(3)使用改進的Euler法求解。問題(4)(I)(IV)使用四屆標准龍格庫塔法求解。

㈣ Runge--kutta演算法

龍格-庫塔(Runge-Kutta)方法是一種在工程上應用廣泛的高精度單步演算法。由於此演算法精度高,採取措施對誤差進行抑制,所以其實現原理也較復雜。該演算法是構建在數學支持的基礎之上的。

對於一階精度的歐拉公式有: yi+1=yi+hki

其中h為步長,則yi+1的表達式與y(xi+1)的Taylor展開式的前兩項完全相同,即局部截斷誤差為O(h2)。 當用點xi處的斜率近似值k1與右端點xi+1處的斜率k2的算術平均值作為平均斜率k∗的近似值,那麼就會得到二階精度的改進歐拉公式: yi+1=yi+h(k1+k2)

其中k1=f(xi,yi),k2=f(xi+h,yi+hk1) 依次類推,如果在區間[xi,xi+1]內多預估幾個店上的斜率值k1,k2,…,km,並用他們的加權平均數作為平均斜率k∗的近似值,顯然能夠構造出具有很高精度的高階計數公式。 上述兩組公式在形式刪過的共同點:都是用f(x,y)在某些點上值得線性組合得出y(xi+1)的近似值yi+1,且增加計算的次數,可以提高截斷誤差的階,他們的誤差估計可以用f(x,y)在xi處的Taylor展開來估計。

於是可考慮用函數f(x,y)在若干點上的函數值的線性組合老構造金斯公式,構造時要求近似公式在f(xi,yi)處的Taylor展開式與解y(x)在xi處的Taylor展開式的前面幾項重合,從而使金斯公式達到所需要的階數。既避免求高階導數,又提高了計算方法精度的階數。或者說,在[xi,xi+1]這一步內計算多個點的斜率值,若夠將其進行加權平均作為平均斜率,則可構造出更高精度的計算格式,這就是龍格-庫塔(Runge-Kutta)方法。
一般的龍格-庫塔法的形式為

#include"stdio.h"
#include"stdlib.h"
voidRKT(t,y,n,h,k,z)
intn;/*微分方程組中方程的個數,也是未知函數的個數*/
intk;/*積分的步數(包括起始點這一步)*/
doublet;/*積分的起始點t0*/
doubleh;/*積分的步長*/
doubley[];/*存放n個未知函數在起始點t處的函數值,返回時,其初值在二維數組z的第零列中*/
doublez[];/*二維數組,體積為nxk.返回k個積分點上的n個未知函數值*/
{
externvoidFunc();/*聲明要求解的微分方程組*/
inti,j,l;
doublea[4],*b,*d;
b=malloc(n*sizeof(double));/*分配存儲空間*/
if(b==NULL)
{
printf("內存分配失敗 ");
exit(1);
}
d=malloc(n*sizeof(double));/*分配存儲空間*/
if(d==NULL)
{
printf("內存分配失敗 ");
exit(1);
}
/*後面應用RK4公式中用到的系數*/
a[0]=h/2.0;
a[1]=h/2.0;
a[2]=h;
a[3]=h;
for(i=0;i<=n-1;i++)
z[i*k]=y[i];/*將初值賦給數組z的相應位置*/
for(l=1;l<=k-1;l++)
{
Func(y,d);
for(i=0;i<=n-1;i++)
b[i]=y[i];
for(j=0;j<=2;j++)
{
for(i=0;i<=n-1;i++)
{
y[i]=z[i*k+l-1]+a[j]*d[i];
b[i]=b[i]+a[j+1]*d[i]/3.0;
}
Func(y,d);
}
for(i=0;i<=n-1;i++)
y[i]=b[i]+h*d[i]/6.0;
for(i=0;i<=n-1;i++)
z[i*k+l]=y[i];
t=t+h;
}
free(b);/*釋放存儲空間*/
free(d);/*釋放存儲空間*/
return;
}
main()
{
inti,j;
doublet,h,y[3],z[3][11];
y[0]=-1.0;
y[1]=0.0;
y[2]=1.0;
t=0.0;
h=0.01;
RKT(t,y,3,h,11,z);
printf(" ");
for(i=0;i<=10;i++)/*列印輸出結果*/
{
t=i*h;
printf("t=%5.2f ",t);
for(j=0;j<=2;j++)
printf("y(%d)=%e",j,z[j][i]);
printf(" ");
}
}voidFunc(y,d)doubley[],d[];
{
d[0]=y[1];/*y0'=y1*/
d[1]=-y[0];/*y1'=y0*/
d[2]=-y[2];/*y2'=y2*/
return;
}

㈤ 救命~龍格庫塔法 C語言

首先將高階微分方程降階成為兩個一階方程,即令y』=z;說下思路,定義兩個double型的數組,分別儲存數據y,z;
在for循環中,利用四階龍閣庫塔公式y[i+1]=y[i]+h*z[i]+h*h/6*(L1+L2+L3);z[i+1]=z[i]+h/6*(L1+2L2+3L3+L4);其中L1=f(i,y[i],z[i]);L2=f(i+h/2,y[i]+h/2*z[i],z[i]+h/2*L1);L3=f(i+h/2,y[i]+h/2*z[i]+h*h/4*L1,z[i]+h/2*L2);L4=f(i+h,y[i]+h*z[i]+h*h/2*L2,z[i]+h*L3);這樣就可以得到需要的值,最後輸出下即可。

㈥ C語言四階龍格庫塔的應用!!出現錯誤error C2064: term does not evaluate to a function

將 double f(double x, double y[], int i) 改成下面的函數
double f(double x, double y[], int i)
{
if (i==0) return(y[6]);
if (i==1) return(y[7]);
if (i==2) return(y[8]);
if (i==3) return(y[9]);
if (i==4) return(y[10]);
if (i==5) return(y[11]);
if (i==6) return((y[3]-y[0])*(6.0/pow(pow(y[0]-y[3],2)+pow(y[1]-y[4],2)+pow(y[2]-y[5],2),7)+3.0/pow(pow(y[0]-y[3],2)+pow(y[1]-y[4],2)+pow(y[2]-y[5],2),4)));
if (i==7) return((y[4]-y[1])*(6.0/pow(pow(y[0]-y[3],2)+pow(y[1]-y[4],2)+pow(y[2]-y[5],2),7)+3.0/pow(pow(y[0]-y[3],2)+pow(y[1]-y[4],2)+pow(y[2]-y[5],2),4)));
if (i==8) return((y[5]-y[2])*(6.0/pow(pow(y[0]-y[3],2)+pow(y[1]-y[4],2)+pow(y[2]-y[5],2),7)+3.0/pow(pow(y[0]-y[3],2)+pow(y[1]-y[4],2)+pow(y[2]-y[5],2),4)));
if (i==9) return((y[0]-y[3])*(6.0/pow(pow(y[0]-y[3],2)+pow(y[1]-y[4],2)+pow(y[2]-y[5],2),7)+3.0/pow(pow(y[0]-y[3],2)+pow(y[1]-y[4],2)+pow(y[2]-y[5],2),4)));
if (i==10) return((y[1]-y[4])*(6.0/pow(pow(y[0]-y[3],2)+pow(y[1]-y[4],2)+pow(y[2]-y[5],2),7)+3.0/pow(pow(y[0]-y[3],2)+pow(y[1]-y[4],2)+pow(y[2]-y[5],2),4)));
if (i==11) return((y[2]-y[5])*(6.0/pow(pow(y[0]-y[3],2)+pow(y[1]-y[4],2)+pow(y[2]-y[5],2),7)+3.0/pow(pow(y[0]-y[3],2)+pow(y[1]-y[4],2)+pow(y[2]-y[5],2),4)));
}

㈦ 求一個用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;
}

㈧ 請問C#裡面有沒有龍格庫塔法的函數

貌似沒有現成的類庫,C#本來就不是為計算提供專門支持的語言,而且計算效率也沒有C高。
不過你也可以自己編一個函數,用遞歸應該很容易編出來吧。

㈨ c語言用龍格庫塔法求微分方程 問題急求😢😢😢

希望可以幫到你

㈩ 運用C語言,龍格庫塔求解微分方程組

一下微分方程組,我加分 function df=ode45_fun(t,xyzuvw) %%注意小寫的v和大寫的V %常數(請修正) R_0=1; rho_0=1; beta=1; G=6.67 ..