如何用 IVP 欧拉求解两个 ODE:MATLAB
how to solve two ODE with IVP euler: MATLAB
我知道如何使用 Euler 求解一首简单的 ode,但对输入初始值和求解它们感到困惑
如果我有两个 ODE
dx1/dt=x1*t+x2
dx2/dt=2*x1-x2*t
现在我得到了首字母 values/guess
x1,0=1
x2,0=2
delta(t)=0.0001h
我需要使用 IVP Euler 从 t=0 到 t=2hr 评估这个 ODE
由于时间是从 0 到 2 小时,步长为 0.0001 小时,我们可以得到 tspan
初始值为 (1,2)
我们可以用matlab的ode45函数来求解
最后我们可以绘制值
tspan = 0:0.0001:2; % simulation time and step size
x0 = [1; 2]; % initial condition
[t, y] = ode45(@(t,y) [t*x(1) + x(2); 2*x(1) - t*x(2)], tspan, x0);
plot(t, y)
其他人的回答是神的尝试,但是不正确,因为混淆了 x 和 y,并且因为 tspan 定义不正确。这是一个有效的解决方案。
tspan=[0;2];
x0 = [1; 2];
[t, x] = ode45(@(t,x) [t*x(1) + x(2); 2*x(1) - t*x(2)], tspan, x0);
plot(t,x); legend('x1','x2');
tspan=[开始时间;结束时间].
*x0=*初始条件向量。
[t, x]=ode45(...)
这调用了常微分方程求解器,它使用4阶和5阶Runge-Kutta算法。 ode45() returns t=时间向量,x=数组当时的 x 值。函数定义被传递给 ode45。 x 和 t 传递给 ode45() 的函数必须 return元素为[dx1/dt的向量; dx2/dt]。从代码中可以看出,函数中的公式实际上与指定的导数公式相匹配。时间跨度和初始条件也被传递。为了达到(默认)精度要求,步长在区间内自动且可变地确定。上面的代码生成下面的图。
此解决方案不完全符合原始 post 的要求:它不使用欧拉方法,也没有 0.001 的步长。然而,它确实有效,而且它比 Euler 更好,因为它以更少的函数评估实现了高精度。这是可能的,因为它基本上在每个时间步进行四阶泰勒级数逼近,因此它可以采取大步并且仍然准确。此解决方案中的平均时间步长为 0.055,而原始 post.
中要求的是 0.001
这是完全按照 OP 要求执行的代码:dt=0.001 的欧拉解。
dt=.001; t=0:dt:2;
x=zeros(2,length(t));
x(:,1)=[1;2];
for i=2:length(t), x(:,i)=x(:,i-1)+dt*[t(i-1)*x(1,i-1) + x(2,i-1); 2*x(1,i-1) - t(i-1)*x(2,i-1)]; end
plot(t,x); legend('x1','x2');
上面第1行设置了dt和时间向量t。第 2,3 行初始化 x 矩阵并定义初始条件。第 4 行是一个 for 循环,它使用 Euler 方法求解 ODE。第 5 行绘制结果。该图与上面 ode45() 中的图非常相似。
我知道如何使用 Euler 求解一首简单的 ode,但对输入初始值和求解它们感到困惑
如果我有两个 ODE
dx1/dt=x1*t+x2
dx2/dt=2*x1-x2*t
现在我得到了首字母 values/guess
x1,0=1
x2,0=2
delta(t)=0.0001h
我需要使用 IVP Euler 从 t=0 到 t=2hr 评估这个 ODE
由于时间是从 0 到 2 小时,步长为 0.0001 小时,我们可以得到 tspan
初始值为 (1,2)
我们可以用matlab的ode45函数来求解
最后我们可以绘制值
tspan = 0:0.0001:2; % simulation time and step size
x0 = [1; 2]; % initial condition
[t, y] = ode45(@(t,y) [t*x(1) + x(2); 2*x(1) - t*x(2)], tspan, x0);
plot(t, y)
其他人的回答是神的尝试,但是不正确,因为混淆了 x 和 y,并且因为 tspan 定义不正确。这是一个有效的解决方案。
tspan=[0;2];
x0 = [1; 2];
[t, x] = ode45(@(t,x) [t*x(1) + x(2); 2*x(1) - t*x(2)], tspan, x0);
plot(t,x); legend('x1','x2');
tspan=[开始时间;结束时间].
*x0=*初始条件向量。
[t, x]=ode45(...)
这调用了常微分方程求解器,它使用4阶和5阶Runge-Kutta算法。 ode45() returns t=时间向量,x=数组当时的 x 值。函数定义被传递给 ode45。 x 和 t 传递给 ode45() 的函数必须 return元素为[dx1/dt的向量; dx2/dt]。从代码中可以看出,函数中的公式实际上与指定的导数公式相匹配。时间跨度和初始条件也被传递。为了达到(默认)精度要求,步长在区间内自动且可变地确定。上面的代码生成下面的图。
此解决方案不完全符合原始 post 的要求:它不使用欧拉方法,也没有 0.001 的步长。然而,它确实有效,而且它比 Euler 更好,因为它以更少的函数评估实现了高精度。这是可能的,因为它基本上在每个时间步进行四阶泰勒级数逼近,因此它可以采取大步并且仍然准确。此解决方案中的平均时间步长为 0.055,而原始 post.
中要求的是 0.001这是完全按照 OP 要求执行的代码:dt=0.001 的欧拉解。
dt=.001; t=0:dt:2;
x=zeros(2,length(t));
x(:,1)=[1;2];
for i=2:length(t), x(:,i)=x(:,i-1)+dt*[t(i-1)*x(1,i-1) + x(2,i-1); 2*x(1,i-1) - t(i-1)*x(2,i-1)]; end
plot(t,x); legend('x1','x2');
上面第1行设置了dt和时间向量t。第 2,3 行初始化 x 矩阵并定义初始条件。第 4 行是一个 for 循环,它使用 Euler 方法求解 ODE。第 5 行绘制结果。该图与上面 ode45() 中的图非常相似。