1. 數值分析,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;
}
看看這是不是就你想要的?
2. C語言驗證歐拉公式,我的代碼哪錯了
ss(intx)的函數定義出現錯誤。
1)for初始化變數時,第二個y前面的int不需要.
2)for循環中,需要把後面語句加在花括弧裡面才能,否則第一個if語句成為for語句循環體,後面不可訪問y變數。
可以修改為:
intss(intx)
{
for(intd=2,y=0;d<x;d++)
{
if(x%d==0)
y++;
if(y==0)
return1;
else
return0;
}
return0;//返回你的默認值
}
當然這里返回值,需要你根據邏輯自己調整為合適的值。
3. 用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);
}
}
}
4. C語言驗證歐拉公式
去csdn看看
5. 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)=...
6. 用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;
}
代碼截圖+運行結果
(晚點我再來看後面的幾小問)
7. 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;
}
直接復制的網路的,沒具體看是什麼功能
8. 練習:用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
計算結果中,精度很明顯就可以看出來.