欧拉前进法(matlab)_欧拉向前法 matlab程序
谢谢大家对欧拉前进法(matlab)问题集合的提问。作为一个对此领域感兴趣的人,我期待着和大家分享我的见解和解答各个问题,希望能对大家有所帮助。
1.请用Euler和Matlab函数ode23求解下列微分方程
2.matlab编程问题利用欧拉方法求常微分方程近似数值解
3.关于matlab编程的问题
请用Euler和Matlab函数ode23求解下列微分方程
1--欧拉法
t=0;
h=0.02;
y(1)=10;
for i=2:100000000
y(i)=y(i-1)+0.02*h*(1-0.001*y(i-1))*y(i-1);
if i*h>=20
break;
end
end
2-----ode23
先创建
function dy=dfun(t,y)
dy=0.02*(1-0.001*y)*y;
再编写
[t,y]=ode23(@dfun,[0 120],10);
plot(t,y)
matlab编程问题利用欧拉方法求常微分方程近似数值解
3.6.2
龙格-
库塔方法
改进的欧拉法比欧拉法精度高的原因在于,它在确定平均斜率时,多取了一个点的斜
率值。这样,如果我们在[Xi,X(i+1)]上多取几个点的斜率值,然后对它们作线性组合得到平均
斜率,则有可能构造出精度更高的计算方法。这就是龙格-库塔法的基本思想。龙格-库塔
法可看作是欧拉法思想的提高,属于精度较高的单步法。
龙格-库塔法是求解常微分方程初值问题的最重要的方法之一。MATLAB中提供了几
个采用龙格-库塔法来求解常微分方程的函数,即ode23,ode45,ode113
,ode23s
,ode15s
等,其中最常用的函数是
ode23(
二三阶龙格-库塔函数)和ode45(
四五阶龙格-库塔函数),
下面分别对它们进行介绍。
1
.二三阶龙格-
库塔函数(ode23)
函数
ode23
的调用格式如下:
(1)
[T,Y]=ODE23('F',TSPAN,Y0)
输入参数中的'F'
是一个字符串,表示微分方程的形
式,也可以是
f
(x
,
y
)的M
文件。TSPAN=[T0
TFINAL]表示积分区间,Y0表示初始条件。
函数
ode23
表示在初始条件
Y0下从
T0到TFINAL
对微分方程
'(,)
yFty
=
进行积分。函数
F(T,
Y)
必须返回一列向量,两个输出参数是列向量
T
与矩阵
Y,其中向量
T
包含估计响应
的积分点,而矩阵
Y
的行数与向量
T
的长度相等。向量
T
中的积分点不是等间距的,这是
为了保持所需的相对精度,而改变了积分算法的步长。为了获得在确定点T0,T1,
"的解,
TSPAN=[T0
T1
TFINAL]
。需要注意的是:TSPAN中的点必须是单调递增或单调递减的。
(2)
[T,Y]=ODE23('F',TSPAN,Y0,OPTIONS)
其中,参数
options
为积分参数,它可由函
数ODESET
来设置。Options参数最常用的是相对误差‘RelTol’(
默认值是
1e-3)和绝对误差
‘AbsTol’(默认值是
1e-6),其他参数同上。
(3)
[T,Y]=ODE23('F',TSPAN,Y0,OPTIONS,P1,P2,…)
参数P1,P2,
…可直接输入到函数
F
中去.如
F(T,Y,FLAG,P1,P2,…)。如果参数
OPTIONS为空,则输入
OPTIONS=[
]。也可
以在
ODE文件中(可参阅
ODEFILE函数)指明参数
TSPAN、Y0和OPTIONS的值。如果参
数TSPAN
或Y0
是空,则ODE23函数通过调用ODE文件[TSPAN,
Y0,
OPTIONS]
=
F([
],[
],
'init
')来获得
ODE23函数没有被提供的自变量值。如果获得的自变量表示空,则函
数ODE23会忽略,此时为
ODE23('F')。
(4)
[T,Y,TE,YE,IE]=ODE23('F',TSPAN,Y0,OPTIONS)
此时要求在参数
options
中的事
件属性设为'on'
,ODE文件必须被标记,以便
P(T,Y,'events')
能返回合适的信息,详细可参
阅函数
ODEFILE。输出参数中的
TE是一个列向量,矩阵
YE的行与列向量
TE中元素相
对应,向量
IE
表示解的索引。
2
.四五阶龙格-
库塔函数(ode45)
函数
ode45
的调用格式同
ode23
相同,其差别在于内部算法不同。如果'F'
为向量函数,
则ode23
和ode45
也可用来解微分方程组。
例3.47
分别用二三阶龙格-库塔法和四五阶龙格-库塔法解常微分方程的初值问题:
解:先将微分方程写成自定义函数
exam2fun.m
function
f=exam2fun
(x,y)
f=-y-x*y.^2;
f=f(:);
然后在命令窗口输入以下语句:
>>
[x1,y1]=ode23('exam2fun',[0:0.1:1],1)
x1
=
0
0.1000
0.2000
0.3000
0.4000
0.5000
0.6000
0.7000
0.8000
0.9000
1.0000
y1
=
1.0000
0.9006
0.8046
0.7144
0.6314
0.5563
0.4892
0.4296
0.3772
0.3312
0.2910
>>
[x2,y2]=ode45('exam2fun',[0:0.1:1],1)
x2
=
0
0.1000
0.2000
0.3000
0.4000
0.5000
0.6000
0.7000
0.8000
0.9000
1.0000
y2
=
1.0000
0.9006
0.8046
0.7144
0.6315
0.5563
0.4892
0.4296
0.3772
0.3312
0.2910
关于matlab编程的问题
%欧拉法解一阶常微分方程
%?y'=xy^(1/3)
f?=?inline('x*y^(1/3)','x','y');
figure;?hold?on;
for?h?=?[0.1?0.05?0.01]%三个步长
xleft?=?1;?%区域的左边界
xright?=?5;?%区域的右边界
xx?=?xleft:h:xright;%一系列离散的点
n?=?length(xx);%点的个数
y0?=?1;
Euler?=?y0;
for?i?=?2:n
Euler(i)=Euler(i-1)+h*f(xx(i-1),Euler(i-1));end
plot(xx,Euler,'LineWidth',2);
end
%精确解
y?=?((xx.^2+2)/3).^(3/2);
plot(xx,y,'r','LineWidth',2);
grid?on;
下面是我对这道题思路:
1:
对于第一题的微分方程组在matlab中输入[f,g]=dsolve('Df=exp(f*sin(t)+g)','Dg=exp(g*cos(t))+f','t')答案是 Explicit solution could not be found,即没有解析解,因此只能求其近似解,也就是数值解。
求解微分方程的数值解需要知道“函数的初值”“自变量的范围”,即f(0)=?,g(0)=?,变量t的取值范围是多少,然后迭代运算,得到在给定定义域内的近似值。
2:
差分法也就是我们知道的欧拉法(Euler)"思想是用先前的差商近似代替倒数",直白一些的编程说法即:f(i+1)=f(i)+h*f(x,y)其中h是设定的迭代步长,若精度要求不高,一般可取0.01。在定义区间内迭代求解即可。
龙哥库塔法一般用于高精度的求解,即高阶精度的改进欧拉法。
常用的是四阶龙哥库塔:
编程语言如下:
y(i+1)=y(i)+h*(k1+2*K2+2*k3+k4)/6;
k1=f(xi,yi)
k2=f(xi+h/2,yi+h*k1/2);
k3=f(xi+h/2,yi+h*k2/2);
k4=f(xi+h,yi+h*k3);
设置终止条件迭代求解。
思想就是这样,代码如下:
%% 龙哥库塔or欧拉法求解微分方程
t=0:0.01:3; %自变量范围
f = [];
g = [];
f(1) = 0.1; %f初值
g(1) = 1; %g初值
h=0.001;
for i=1:length(t)
%% 欧拉法
% f(i+1) =f(i)+h*(exp(f(i)*sin(t(i)))+g(i));
% g(i+1) =g(i)+h*(exp(g(i)*cos(t(i)))+f(i));
%% 龙哥库塔
kf1 = exp(f(i)*sin(t(i)))+g(i);
kf2 = exp((f(i)+kf1*h/2)*sin(t(i)+h/2))+g(i);
kf3 = exp((f(i)+kf2*h/2)*sin(t(i)+h/2))+g(i);
kf4 = exp((f(i)+kf3*h)*sin(t(i)+h))+g(i);
f(i+1) = f(i) + h*(kf1+2*kf2+2*kf3+kf4)/6;
kg1 = exp(f(i)*cos(t(i)))+f(i);
kg2 = exp((f(i)+kg1*h/2)*cos(t(i)+h/2))+f(i);
kg3 = exp((f(i)+kg2*h/2)*cos(t(i)+h/2))+f(i);
kg4 = exp((f(i)+kg3*h)*cos(t(i)+h))+f(i);
g(i+1) = g(i) + h*(kg1+2*kg2+2*kg3+kg4)/6;
end
figure(1)
plot(t,f(1:length(t)),t,g(1:length(t)));
legend('f函数','g函数')
好了,今天关于欧拉前进法(matlab)就到这里了。希望大家对欧拉前进法(matlab)有更深入的了解,同时也希望这个话题欧拉前进法(matlab)的解答可以帮助到大家。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。