在MatLab里面用隐式欧拉法(backward euler)解决常微分方程。初学matlab 好多都不会,知道的帮下忙
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在MatLab里面用隐式欧拉法(backward euler)解决常微分方程。初学matlab 好多都不会,知道的帮下忙相关的知识,希望对你有一定的参考价值。
在MATLAB 里面写一个程序:要求用 隐式欧拉法(backward euler) 去解决常微分方程。原理我懂,就是不会用MATLAB 写出来。 下面是两个例题,希望知道的帮下忙写具体点,然后我能从中学习到。谢谢各位了,在线等。
1. x' = - 2x ; 还给出准确值是: x= e^(-2t)
要求: 求出t=0, 这是一个初始值,然后算出在区间[0,5] 的值。 还给出 步长(step size) h=0.1
2. x' = xsint - 2x^2; 给出初始条件 x(0) = 0
要求: 求出在区间[0,1] 的值,比较 h=0.01 和 h=0.001 在 t = 1 这里。
知道的帮忙写下程序啊。着急啊
backward 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)+h*feval(odefun,x(k),y(k),varargin:);
z1=inf;
while abs(z1-z0)>1e-4
z1=y(k)+h*feval(odefun,x(k+1),z0,varargin:);
z0=z1;
end
y(k+1)=z1;
end
x=x;y=y;
2.在命令窗口直接调用上面的程序,求解常微分问题:
(1)
f=@(t,x)-2*x;
[t,x]=Implicit_Euler(f,[0 5],1,0.1);
t1=0:0.1:5;
x1=exp(-2*t);
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)x*sin(t)-2*x^2;
>> [t,x]=Implicit_Euler(f,[0 1],1,0.01);
>> [t1,x1]=Implicit_Euler(f,[0 1],1,0.001);
>> e=x1(end)-x(end)
e =
-0.0029
>> plot(t,x,'r:')
>> hold on
>> plot(t1,x1,'g--')
>> xlabel('t');ylabel('x')
>> legend('积分步长为0.01','积分步长为0.001')
>>本回答被提问者和网友采纳 参考技术B matlab里的euler法数值积分是过时的积分算法,不知道还能用吗。
android隐式intent使用场景解析
Android 隐式intent相信大家都有用过,大部分场景我们用显式intent已经能满足我们的业务需求,隐式intent大部分都是用来启动系统自带的Activity或Service之类的组件。昨天有个业务场景就是,我在第三方依赖库 module A里面有个Activity A,现在需要在Activity A里面启动 module app里面的Activity B,我想了一下,可以用隐式intent来实现这个功能,而且实现代码最简洁,不用修改或添加其他代码。
隐式intent很简单,首先要在AndroidManifest.xml里面注册Activity B,代码如下:
<activity android:name="com.xjx.demo.home.BActivity" android:screenOrientation="portrait"> <intent-filter> <action android:name="com.demoBActivity.action" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
<intent-filter>是隐式intent必须的,其中<action android:name>属性是自定义的,写什么都可以,最好是自己的项目名,
<category >属性使用默认的 <category android:name="android.intent.category.DEFAULT" />。
注册Activity完成了,现在可以启动Activity了。
代码如下:
//这里用到了隐式意图,来启动app库里面的activity Intent intent = new Intent(); intent.setAction("com.demoBActivity.action"); intent.addCategory("android.intent.category.DEFAULT"); startActivity(intent);
action写我们AndroidManifest注册的action即可。
这样即可实现在一个module里面启动另一个 module中的Activity或其他组件。实现了module之间代码的解耦。
以上是关于在MatLab里面用隐式欧拉法(backward euler)解决常微分方程。初学matlab 好多都不会,知道的帮下忙的主要内容,如果未能解决你的问题,请参考以下文章
MATLAB常微分方程数值解——欧拉法改进的欧拉法与四阶龙格库塔方法
MATLAB实战应用案例:欧拉法改进欧拉法ode45求解微分方程实例