當前位置:首頁 » 編程語言 » 歐拉法c語言

歐拉法c語言

發布時間: 2022-07-14 22:13:00

Ⅰ 用c語言實現分別用歐拉法和改進的歐拉法計算常微分方程:y'=-x*y^2 (x>=0且x<=3) ;y(0)=2,,可用vc6.0運行

// zifuchuan.cpp : Defines the entry point for the console application.
//
#include "stdio.h"
#include 「stdlib.h」
#define N 20
//#define exit 0
int length(char *p)
{
int i,count=0;
for(i=0;p[i]!='\0';i++)
count++;
return count;
}
void (char *p1,char *p2)
{
int i;
for(i=0;p2[i]!='\0';i++)
p1[i]=p2[i];
if(p1[i]!='\0')
p1[i]='\0';
printf("復制完成\n");
printf("%s\n",p1);
}
int compare(char *p1,char *p2)
{
int i,j;
for(i=0;p1[i]!='\0'||p2[i]!='\0';i++)
if(p1[i]!=p2[i])
{
j=p1[i]-p2[i];
return j;
}
return 0;
}
int main(int argc, char* argv[])
{
char p1[20],p2[20];
int e,f;
printf("請輸入字元串\n");
printf("請輸入字元串p1\n");
scanf("%s",p1);
printf("請輸入字元串p2\n");
scanf("%s",p2);
// printf("請輸入字元串p2\n");
// scanf("%s",p2);
while(1)
{
printf("----------1.求字元串長度----------\n");
printf("------------2.復制拷貝字元串----------\n");
printf("------------3.比較字元串------------\n");
printf("--------------4.退出程序--------------\n");
int choose;
printf("請選擇:");
scanf("%d",&choose);
switch(choose)
{
case 1:e=length(p1);printf("%d\n",e);break;
case 2:(p1,p2);break;
case 3:f=compare(p1,p2);printf("%d\n",f);break;
case 4:exit(0);
}
}
}

Ⅱ 數值分析,C語言實現用改進的歐拉方法求解題微分方程,其中步長取為0.1。急求,在線等。

何為改進的歐拉方法?是Euler-Richardson演算法嗎?

#include<stdio.h>
#include<conio.h>
#include<math.h>
doubleWeiFen(doublex,doubley){
returny*y*(cos(x)-sin(x))-y;
}
voidEulerRichardson(double&x,double&y,doubledx){
//歐拉理查德演算法進行迭代
doubledy_dx,ymid,xmid,dx_2;
dx_2=dx/2;
dy_dx=WeiFen(x,y);//得到起點的變化率
ymid=y+dy_dx*dx_2;
xmid=x+dx_2;
dy_dx=WeiFen(xmid,ymid);//得到中間點的變化率
y+=dy_dx*dx;
x+=dx;
}
intmain(){
doublex=0,y=1,xm=1.0,dx=0.1;
printf("x y %lg %lg ",x,y);
while(x<xm){
EulerRichardson(x,y,dx);
printf("%lg %lg ",x,y);
}
printf(" Finished! ");
getch();
return0;
}

看看這是不是就你想要的?

Ⅲ matlab實現歐拉法和RK-4方法的數值計算

程序已經寫了,不過步長你得自己調,當步長較小時,計算時間會很長
另外,tend是時間的終值,你可以設小一些。因為解析解為10*cos(x),我設成pi,就是計算半個周期。

x''(t)=-x(t)
引入y1=x,y2=x',則
y1'=y2
y2'=-x=-y1

初始條件為:
y1(0)=10;
y2(0)=0;

將下面兩行百分號之間的內容,保存成DiffEulerRk4.m
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function MaxDiffX=DiffEulerRk4(dt,PlotFlag)
%dt是步長
%PlotFlag是否作圖
if nargin<1
dt=0.01;
end
if nargin<2
PlotFlag=0;
end

f=inline('[y(2);-y(1)]','t','y'); %微分方程的右邊項
t0=0; %初始時刻
tend=pi; %計算的點數
tt=t0:dt:tend; %一系列離散的點
N=length(tt); %點數
y0=[10;0];

%%(1)歐拉法
EulerY=y0;
for i=2:N
EulerY(:,i)=EulerY(:,i-1)+dt*f(tt(i-1),EulerY(:,i-1));
end
EulerX=EulerY(1,:); %取x

%%(2)龍格庫塔法
RkY=y0;
for i=2:N
k1=f(tt(i-1), RkY(:,i-1));
k2=f(tt(i-1)+dt/2, RkY(:,i-1)+k1*dt/2);
k3=f(tt(i-1)+dt/2, RkY(:,i-1)+k2*dt/2);
k4=f(tt(i-1)+dt, RkY(:,i-1)+k3*dt);
RkY(:,i)=RkY(:,i-1)+(k1+2*k2+2*k3+k4)*dt/6;
end
RkX=RkY(1,:); %取x

%精確解
syms t
analytic=dsolve('D2x=-x','x(0)=10','Dx(0)=0','t');
rightdata=subs(analytic,t,tt);

if PlotFlag
plot(tt,EulerX,'b-',tt,RkX,'r--',tt,rightdata,'g-.')
legend('Euler','Runge-Kutta','analytic')
end

MaxDiffX=[max(abs(RkX-rightdata)),max(abs(EulerX-rightdata))];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

所有題,都得你自己調步長。
輸入:
DiffEulerRk4(0.01,1) %步長取0.01的計算結果,參數為1代表作圖,自己得修改步長

%%下面是變化
Error=[];
Dt=[5e-4,1e-3,2e-3,5e-3,0.01,0.05,0.1];
for dt=Dt %幾種步長,自行修改
dt %查看dt,步長小,計算量大
Error_1=DiffEulerRk4(dt); %不作圖
Error=[Error;Error_1]; %保存歐拉法誤差
end
semilogx(Dt,Error)
legend('Euler','RK4')
xlabel('步長')
ylabel('誤差')
title('與理論值誤差')

Ⅳ C語言實現歐拉函數

int eular(int n)
{
int ret=1,i; //定義變數
for(i=2;i*i<=n;i++) //從i=2開始循環,判定條件為i*i小於等於n,循環一次i增加1
if(n%i==0) //判定條件為n除以i的余數等於0
{
n/=i,ret*=i-1; //n=n/i,ret = ret*(i-1)
while(n%i==0) //當n除以i的余數等於0時執行下面的語句,否則跳過
n/=i,ret*=i;
}
if(n>1) //如果n>1執行下面語句,否則跳過
ret*=n-1; //ret = ret*(n-1)
return ret;
}

直接復制的網路的,沒具體看是什麼功能

Ⅳ 用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;

}

代碼截圖+運行結果

(晚點我再來看後面的幾小問)

Ⅵ 常微分方程初值問題的Euler方法和改進Euler方法的研究與實現 用C語言求解!!

*Author:Wacs5*Date:20090106(YYYY-MM-DD)*Function:歐拉方法與改進的歐拉方法求常微分方程*Describe*用歐拉方法與改進的歐拉方法求初值問題dy/dx=(2x)/(3y^2)*y(0)=1,在區間[0,1]上取步長h=0.1的數值解。*要求:顯示各x值下(0、0.1、0.2…0.9、1)兩種方法計算的y值。

Ⅶ c語言 用歐拉方法與改進的歐拉方法求初值問題

/*******************************************************
*Author :Wacs5
*Date :20090106(YYYY-MM-DD)
*Function :歐拉方法與改進的歐拉方法求常微分方程
*Describe
*用歐拉方法與改進的歐拉方法求初值問題dy/dx=(2x)/(3y^2)
* y(0)=1 ,在區間[0,1]上取步長h=0.1的數值解。
*要求:顯示各x值下(0、0.1、0.2… 0.9、1)兩種方法計算的y值。
*********************************************************/
#include <stdio.h>
#include <conio.h>
#include <math.h>

double f(double x,double y)
{
return 2*x/3/y/y;
}

int main()
{
int i;
double x,y,y0=1,dx=0.1;
double xx[11];
double euler[11],euler_2[11];
double temp;
double f(double x,double y);

for (i=0;i<11;i++)
xx[i]=i*dx;

euler[0]=y0;
for (i=1,x=0;i<11;i++,x+=dx)
euler[i]=euler[i-1]+dx*f(x,euler[i-1]);

euler_2[0]=y0;
for (i=1,x=0;i<11;i++,x+=dx)
{
temp=euler_2[i-1]+dx*f(x,euler_2[i-1]);
euler_2[i]=euler_2[i-1]+dx*(f(x,euler_2[i-1])+f(x+dx,temp))/2;
}

for (i=0,x=0;i<11;i++,x+=dx)
printf("x=%lf\teluer=%lf\teuler_2=%lf\taccu=%lf\n",x,euler[i],euler_2[i],pow(1+x*x,1.0/3));
getch();
}

最後一列是理論的解析解的值.

Ⅷ 用歐拉法和隱式迭代法求解初值問題

教師的可悲,哎

熱點內容
映像壓縮 發布:2024-05-21 05:46:53 瀏覽:726
小葫蘆直播助手伺服器地址 發布:2024-05-21 05:46:51 瀏覽:969
遨遊緩存視頻 發布:2024-05-21 05:46:47 瀏覽:784
家用電腦能裝伺服器 發布:2024-05-21 05:45:56 瀏覽:437
閉魚腳本 發布:2024-05-21 05:45:54 瀏覽:66
動態范圍壓縮開還是關 發布:2024-05-21 05:44:23 瀏覽:549
本田crv兩驅買哪個配置 發布:2024-05-21 05:41:22 瀏覽:75
手機淘寶緩存視頻 發布:2024-05-21 05:21:09 瀏覽:348
4款配置怎麼選 發布:2024-05-21 05:20:03 瀏覽:586
python服務重啟 發布:2024-05-21 05:07:51 瀏覽:668