当前位置:首页 » 编程语言 » 欧拉法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();
}

最后一列是理论的解析解的值.

Ⅷ 用欧拉法和隐式迭代法求解初值问题

教师的可悲,哎

热点内容
windows文件夹图标下载 发布:2024-05-19 13:25:44 浏览:689
数据库存储数据类型 发布:2024-05-19 13:25:28 浏览:584
电脑开机密码忘记了如何解锁没有管理员窗口 发布:2024-05-19 13:24:50 浏览:277
畅捷支付刷脸机如何设置密码 发布:2024-05-19 13:03:10 浏览:764
java麻将 发布:2024-05-19 13:03:00 浏览:433
存储过程大数据游标 发布:2024-05-19 13:00:50 浏览:515
内存存储价格 发布:2024-05-19 13:00:48 浏览:389
隔离期的算法 发布:2024-05-19 12:55:13 浏览:530
苹果怎么装安卓模拟器 发布:2024-05-19 12:42:15 浏览:801
脚本养微信 发布:2024-05-19 12:42:14 浏览:148