1. 用c語言編程歐拉法、梯形法、二級二階R-K、三級三階R-K、四級四階R-K求解下列方程的數值解
歐拉法求解y'=-2y-4x, x0=0, y0=2, x<=1的求解如下:
#include<stdio.h>
/*solve ode: dy/dx = -2*y -4*x*/
float fun(float x,float y){
float f;
f=-2.0*y -4.0*x;
return f;
}
int main(){
float x0=0,y0=2.0,x,y,h=0.1,t=1.0,k;
/* printf(" Enter x0,y0,h,xn: "); scanf("%f%f%f%f",&x0,&y0,&h,&t);*/
x=x0;
y=y0;
printf(" x y ");
while(x<=t) {
k=h*fun(x,y);
y=y+k;
x=x+h;
printf("%0.3f %0.3f ",x,y);
}return 0;
}
代碼截圖+運行結果
(晚點我再來看後面的幾小問)
2. c語言編程 用歐拉法和改進歐拉法(歐拉預估校正法)分別編程!急求,馬上交作業!!對圖片上的題解答
f=inline('x*y','x','y');%微分方程的右邊項 dx=0.05;%x方向步長 xleft=0;%區域的左邊界 xright=3;%區域的右邊界 xx=xleft:dx:xright;%一系列離散的點 n=length(xx);%點的個數 y0=1; %%(1)歐拉法 Euler=y0; fori=2:n Euler(i)=...
3. 隱士 歐拉公式怎麼寫
分式里的歐拉公式
a^r/(a-b)(a-c)+b^r/(b-c)(b-a)+c^r/(c-a)(c-b)
當r=0,1時式子的值為0 當r=2時值為1
當r=3時值為a+b+c
e^ix=cosx+isinx,e是自然對數的底,i是虛數單位。它將三角函數的定義域擴大到復數,建立了三角函數和指數函數的關系,它在復變函數論里佔有非常重要的地位。
e^ix=cosx+isinx的證明:
因為e^x=1+x/1!+x^2/2!+x^3/3!+x^4/4!+……
cos x=1-x^2/2!+x^4/4!-x^6/6!……
sin x=x-x^3/3!+x^5/5!-……
在e^x的展開式中把x換成±ix.(±i)^2=-1, (±i)^3=〒i, (±i)^4=1 ……(注意:其中」〒」表示」減加」)
e^±ix=1±x/1!-x^2/2!+x^3/3!〒x^4/4!……
=(1-x^2/2!+……)±i(x-x^3/3!……)
所以e^±ix=cosx±isinx
將公式里的x換成-x,得到:
e^-ix=cosx-isinx,然後採用兩式相加減的方法得到:sinx=(e^ix-e^-ix)/(2i),cosx=(e^ix+e^-ix)/2.這兩個也叫做歐拉公式。將e^ix=cosx+isinx中的x取作∏就得到:
e^iπ+1=0.這個恆等式也叫做歐拉公式
三角形中的歐拉公式
設R為三角形外接圓半徑,r為內切圓半徑,d為外心到內心的距離,則: d^2=R^2-2Rr
拓撲學里的歐拉公式
V+F-E=X(P),V是多面體P的頂點個數,F是多面體P的面數,E是多面體P的棱的條數,X(P)是多面體P的歐拉示性數。
如果P可以同胚於一個球面(可以通俗地理解為能吹脹而綳在一個球面上),那麼X(P)=2,如果P同胚於一個接有h個環柄的球面,那麼X(P)=2-2h。
X(P)叫做P的歐拉示性數,是拓撲不變數,就是無論再怎麼經過拓撲變形也不會改變的量,是拓撲學研究的范圍。
在多面體中的運用:
簡單多面體的頂點數V、面數F及棱數E間有關系
V+F-E=2
這個公式叫歐拉公式
初等數論里的歐拉公式
歐拉φ函數:φ(n)是所有小於n的正整數里,和n互素的整數的個數。n是一個正整數。
歐拉證明了下面這個式子:
如果n的標准素因子分解式是p1^a1*p2^a2*……*pm^am,其中眾pj(j=1,2,……,m)都是素數,而且兩兩不等。則有
φ(n)=n(1-1/p1)(1-1/p2)……(1-1/pm)
利用容斥原理可以證明它。
此外還有很多著名定理都以歐拉的名字命名。
(6) 立體圖形里的歐拉公式:
面數+頂點數—2=棱數
4. 對常微分方程初值問題,求隱式歐拉方法(圖中的第四大題)
這個看起來,
是一個數學題,
實際上,
是一個腦筋急轉彎,
需要腦筋急轉彎的思路,
去所打。
5. 練習:用c語言編制歐拉法、梯形法和四階R—K法演算法程序,求解下面方程並將計算結果與解析解比較之。
這題量很大.
#include <math.h>
#include <stdio.h>
#include <conio.h>
/*
y'=y-2x/y(0<=x<=1)
y(0)=1問題補充:
步長0.1
*/
int main()
{
double dx=0.1;
double x0=0,x1=1;
double y0=1;
double x,y,Ey,Ty,Ry;
double fun(double x,double y);
double Explicit(double x);
double Euler(double dx,double x,double y);
double Trapz(double dx,double x,double y);
double RK4(double dx,double x,double y);
Ey=Ty=Ry=y0;
printf("x\tEuler\t\tTrapz\t\tRk4\t\tExplict\n");
for (x=x0;x<x1;x+=dx)
{
Ey+=Euler(dx,x,Ey);
Ty+=Trapz(dx,x,Ty);
Ry+=RK4(dx,x,Ry);
y=Explicit(x+dx);
printf("%-4.2f\t%f\t%f\t%f\t%f\n",x,Ey,Ty,Ry,y);
}
getch();
return 0;
}
double fun(double x,double y)
{
return y-2*x/y;
}
double Explicit(double x)
{
/*令Z=y^2,原微分方程可寫為:Z'-2*Z+4*x=0,為一階非齊次常微分方程,代入公式以及初始條件,可得z=1+2*x,最後得y=sqrt(1+2*x)*/
return sqrt(1+2*x);
}
double Euler(double dx,double x,double y)
{
return dx*fun(x,y);
}
double Trapz(double dx,double x,double y)
{
double dy=Euler(dx,x,y);
return (dy+Euler(dx,x+dx,y+dy))/2;
}
double RK4(double dx,double x,double y)
{
int i,j;
double dx_2=dx/2;
double k1,k2,k3,k4;
k1=dx*fun(x,y);
k2=dx*fun(x+dx_2,y+k1/2);
k3=dx*fun(x+dx_2,y+k2/2);
k4=dx*fun(x+dx,y+k3);
return (k1+2*k2+2*k3+k4)/6;
}
得到的結果:
x Euler Trapz Rk4 Explict
0.00 1.100000 1.095909 1.095446 1.095445
0.10 1.191818 1.184097 1.183217 1.183216
0.20 1.277438 1.266201 1.264912 1.264911
0.30 1.358213 1.343360 1.341642 1.341641
0.40 1.435133 1.416402 1.414216 1.414214
0.50 1.508966 1.485956 1.483242 1.483240
0.60 1.580338 1.552514 1.549196 1.549193
0.70 1.649783 1.616475 1.612455 1.612452
0.80 1.717779 1.678166 1.673325 1.673320
0.90 1.784771 1.737867 1.732056 1.732051
1.0 1.851189 1.795820 1.788861 1.788854
計算結果中,精度很明顯就可以看出來.
6. 這是用matlab做的隱式歐拉法!但是程序提示倒數第二排函數沒定義!怎麼修改呢
lengthh(x)改成length(x), 別的沒什麼問題
如果feval這個函數調用的時候有問題, 把feval(dyfun,x,y)直接寫成dyfun(x,y)