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
计算结果中,精度很明显就可以看出来.