这题量很大
#include <mathh>
#include <stdioh>
#include <conioh>
/
y'=y-2x/y(0<=x<=1)
y(0)=1问题补充:
步长01
/
int main()
{
double dx=01;
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("%-42f\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-2x/y;
}
double Explicit(double x)
{
/令Z=y^2,原微分方程可写为:Z'-2Z+4x=0,为一阶非齐次常微分方程,代入公式以及初始条件,可得z=1+2x,最后得y=sqrt(1+2x)/
return sqrt(1+2x);
}
double Euler(double dx,double x,double y)
{
return dxfun(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=dxfun(x,y);
k2=dxfun(x+dx_2,y+k1/2);
k3=dxfun(x+dx_2,y+k2/2);
k4=dxfun(x+dx,y+k3);
return (k1+2k2+2k3+k4)/6;
}
得到的结果:
x Euler Trapz Rk4 Explict
000 1100000 1095909 1095446 1095445
010 1191818 1184097 1183217 1183216
020 1277438 1266201 1264912 1264911
030 1358213 1343360 1341642 1341641
040 1435133 1416402 1414216 1414214
050 1508966 1485956 1483242 1483240
060 1580338 1552514 1549196 1549193
070 1649783 1616475 1612455 1612452
080 1717779 1678166 1673325 1673320
090 1784771 1737867 1732056 1732051
10 1851189 1795820 1788861 1788854
计算结果中,精度很明显就可以看出来
1新建一个m文件,编写隐式Euler法的程序:
function [x,y]=Implicit_Euler(odefun,xspan,y0,h,varargin)
% 隐式Euler公式求解常微分方程
% 输入参数:
% ---odefun:微分方程的函数描述
% ---xspan:求解区间[x0,xn]
% ---y0:初始条件
% ---h:迭代步长
% ---p1,p2,…:odefun函数的附加参数
% 输出参数:
% ---x:返回的节点,即x=xspan(1):h:xspan(2)
% ---y:微分方程的数值解
x=xspan(1):h:xspan(2);
y(1)=y0;
for k=1:length(x)-1
z0=y(k)+hfeval(odefun,x(k),y(k),varargin{:});
z1=inf;
while abs(z1-z0)>1e-4
z1=y(k)+hfeval(odefun,x(k+1),z0,varargin{:});
z0=z1;
end
y(k+1)=z1;
end
x=x;y=y;
2在命令窗口直接调用上面的程序,求解常微分问题:
(1)
f=@(t,x)-2x;
[t,x]=Implicit_Euler(f,[0 5],1,01);
t1=0:01:5;
x1=exp(-2t);
plot(t1,x1)
hold on
plot(t,x,'k-','markersize',16)
legend('解析解','隐式Euler求解结果')
xlabel('t');ylabel('x');
(2)此题你给出的初值好像有问题吧,x0=0的话,求解的结果都是为0,所以我改用x0=1求解试了一下:
>> f=@(t,x)xsin(t)-2x^2;
>> [t,x]=Implicit_Euler(f,[0 1],1,001);
>> [t1,x1]=Implicit_Euler(f,[0 1],1,0001);
>> e=x1(end)-x(end)
e =
-00029
>> plot(t,x,'r:')
>> hold on
>> plot(t1,x1,'g--')
>> xlabel('t');ylabel('x')
>> legend('积分步长为001','积分步长为0001')
>>
>
matlab中没有内置MyEuler函数、MyEulerPro函数,是要根据Euler法的公式自己编写的。
MyEuler程序是用欧拉法来求解微分方程。此方法简单但精度要低一点。
欧拉克罗默法的原理?用MATLAB实现用欧拉-克罗默法求解阻尼摆,且q=1dsolve1MATLAB求解函desolve('Dy = 2(1-001y)y','y(0) = 20','t') result1=dsolve('Dy=2(1-001y)y','y(0)=20','t') %符号型syms y(t) %数值型desolve(diff(y,t,1)==2(1-001y)y,y(0)==20) %diff(y,t,1)--->y关于t的一阶导数2欧拉法与修正(不能求解解析解的情况下,数值解)dy/dx = f(x,y) x>x0区间取定离散点(步长一定)取定步长: h,记 xn = x0 + nh, ( n = 1,2, ···, N ) 欧拉法是考察流体流动的一种方法。通常考察流体流动的方法有两种,即拉格朗日法和欧拉法。欧拉法(euler method)是以流体质点流经流场中各空间点的运动即以流场作为描述对象研究流动的方法——流场法。
euler公式是欧拉公式,英文全称为Euler's formula。
欧拉公式是欧哈德·欧拉在十八世纪创造的,是数学界最著名、最美丽的公式之一。之所以如此,是因为它涉及到各种显然非常不同的元素,比如无理数e、虚数和三角函数。R+ V- E= 2就是欧拉公式。
作用:
欧拉公式容易理解的有两个作用,一个是用于多面体的,而另外—个是用于级数展开的。欧拉公式数学中起到至关作用的数字被它联系了起来,两个超越数,自然对数的底e和圆周率π两个单位,虚数单位和自然数的单位1以及人类数学史上最伟大的发现0。因此在数学家的眼中,欧拉公式应是上帝的公式。
第一个证明欧拉公式的人是20岁的柯西,他通过多面体设想的方法肯定了欧拉公式存在的意义。欧拉公式的种变换,欧拉恒等式它被称作是数学中最美妙的一个公式。
以上就是关于练习:用c语言编制欧拉法、梯形法和四阶R—K法算法程序,求解下面方程并将计算结果与解析解比较之。全部的内容,包括:练习:用c语言编制欧拉法、梯形法和四阶R—K法算法程序,求解下面方程并将计算结果与解析解比较之。、在MatLab里面用隐式欧拉法(backward euler)解决常微分方程。初学matlab 好多都不会,知道的帮下忙、请帮忙用C++编一个计算欧拉函数的程序。谢谢!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)