- 3
- 0
- 约4.01千字
- 约 11页
- 2019-01-01 发布于天津
- 举报
课题10.常微分方程初值问题的数值方法
PAGE
PAGE 1
课题10. 常微分方程初值问题的数值方法
一.问题提出
(1)利用欧拉方法和改进的欧拉方法求解初值问题:
dy/dx=4*x/y-x*y; y(0)=3; 其中0x=2
二.问题算法、c语言编程和上机运算结果
1.欧拉法
算法:
输入微分方程f(x,y);
输入积分部数n;
输入初值x0,y0;
输入步长h;
利用k1=f(xn,yn)
y(n+1)=yn+k1*h;
n=0,1,2……
采取不断循环计算;
输出x1,x2,……xn.
程序:
/*微分方程 */
float f(x,y)
float x,y;
{
float z;
z=4*x/y-x*y;
return(z);
}
/* 欧拉法 */
float EULAR(f)
float (*f)();
{
int i,n;
float x0,y0,x,y,k1,h;
printf(\n请输入积分步数n:);
scanf(%d,n);
printf(\n请输入初值x(0) y(0):);
scanf(%f%f,x0,y0);
printf(\n请输入步长h:);
scanf(%f,h);
printf(\n x y);
printf(\n %f %f,x0,y0);
for(i=1;i=n;i++)
{
x=x0+h;
k1=(*f)(x0,y0);
y=y0+h*k1;
printf(\n %f %f,x,y);
x0=x;
y0=y;
}
}
main()
{
EULAR(f);
}
结果:
(1)h=0.1时
(2)h=0.2时
(3)h=0.4时
2.改进的欧拉法
算法:
输入微分方程f(x,y);
输入积分部数n;
输入初值x0,y0;
输入步长h;
利用k1=f(xn,yn)
k2=f(xn+h,yn+h*k1)
y(n+1)=yn+(k1+k2)/2;
n=0,1,2……
采取不断循环计算;
输出x1,x2,……xn.
程序:
/*微分方程 */
float f(x,y)
float x,y;
{
float z;
z=y-2.0*x/y;
return(z);
}
/* 改进欧拉法 */
float EULAR(f)
float (*f)();
{
int i,n;
float x0,y0,x,y,k1,k2,h;
printf(\n请输入积分步数n:);
scanf(%d,n);
printf(\n请输入初值x(0) y(0):);
scanf(%f%f,x0,y0);
printf(\n请输入步长h:);
scanf(%f,h);
printf(\n x y);
printf(\n %f %f,x0,y0);
for(i=1;i=n;i++)
{
x=x0+h;
k1=(*f)(x0,y0);
k2=(*f)(x,y0+h*k1);
y=y0+h*(k1+k2)/2.0;
printf(\n %f %f,x,y);
x0=x;
y0=y;
}
}
main()
{
EULAR(f);
}
结果:
(1)当h=0.1时
(2)当h=0.2时
(3)当h=0.4时
三.结果分析讨论
1.对比欧拉法,改进的欧拉法和精确解的结果可知,改进的欧拉法所得到结果的精度比欧拉法的大,这是因为改进的欧拉法融入了属于隐式公式的梯形公式,它的计算数值解的精度要比欧拉公式好。
2.从结果分析可以发现,无论是欧拉法还是改进的欧拉法,当步长h取得越小时,所得到的解的精度越大,因此减小步长h可以提高精度。
3.利用欧拉法和改进的欧拉法求解常微分方程初值问题是可行的。
附:(国庆放假时编的程序)课题4 迭代格式的比较
王佳琪 学号092071
一.各迭代函数编程及初步分析
1. x=(3*x+1)/(x*x) c语言编程为:
#includemath.h
main()
{
float x0=1.0,x1; int i;
x1=(3*x0+1)/(x0*x0);
printf(%1.5f ,x1);
for(i=1;i=50fabs(x1-x0)1.0E-5;i++)
{
x0=x1;
x1=(3*x0+1)/(x0*x0);
printf(%1.5f ,x1);
}
printf(\nyi dai times: %d,i
原创力文档

文档评论(0)