Explicit和Implicit迭代的一个例子

博客通过对比显式迭代法的前向欧拉和隐式迭代法的后向欧拉,解释了两种方法在解决常微分方程数值解时的不同特性。前向欧拉迭代计算量小但有稳定性限制,而后向欧拉则无条件收敛但需要额外计算。文章通过一个具体例子展示了两种方法的收敛性,并提供了MATLAB实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

CAE求解方法一般有两种

1. 显式(Explicit)

    第n步结果可以从n-1,n-2,...1步的结果直接推导出来,迭代时每步计算量小,但迭代增量也有个限制,不能太大,否则会出现发散

2. 隐式(Implicit)

    第n步结果不能直接从前面结果推导出来,必须做进一步的求解,这样,迭代时每步计算量大,但迭代增量可以很大

用Abaqus一段时间了,但一直对这两种方法没有一个直观的感念。正好前段时间碰到一个前向欧拉和后向欧拉的问题,顺便研究了一下。


前向欧拉和后向欧拉

前向欧拉和后向欧拉分别是显式和隐式的一个典型方法。

前向欧拉:

       fn+1 (x) = fn (x) + h*f'n (x)

后向欧拉:

              fn+1 (x) = fn (x) + h*f'n+1 (x)

 

 

例子

现在计算

y'(x) = -y+x+1

初值y(0) = 1;

的数值解。

前向欧拉:

           yn+1 = yn + h*(-yn +xn +1)

这个式子不需要做任何额外运算就能从n推导出n+1,因此每步迭代计算量小,但h存在一个最大限制.

  &n

### Python 实现显式欧拉方法隐式欧拉方法 对于微分方程 \( \frac{dy}{dt} = f(t, y) \),可以利用不同的数值积分技术来近似其解。 #### 显式欧拉方法 (Explicit Euler Method) 显式欧拉法是一种简单的一阶数值过程,用于解决常微分方程初值问题。该算法基于泰勒级数展开,在每一步使用当前时刻的信息预测下一时刻的状态: \[ y_{n+1} = y_n + h \cdot f(t_n, y_n) \] 其中 \(h\) 是时间步长,\(f(t,y)\) 表示给定的函数[^1]。 下面是用Python实现显式欧拉方法的例子: ```python def explicit_euler(f, t0, y0, h, n): """ 使用显式欧拉方法求解ODE. 参数: f : 函数对象, 定义为 dy/dt=f(t,y). t0 : 初始时间点. y0 : 初始条件y(t0)=y0. h : 时间步长. n : 步数. 返回: ts : 所有时间节点列表. ys : 对应于ts的解决方案列表. """ ts = [t0] ys = [y0] for i in range(n): tn = ts[-1] yn = ys[-1] # 计算下一个状态 next_y = yn + h * f(tn, yn) ys.append(next_y) ts.append(tn+h) return ts, ys ``` #### 隐式欧拉方法 (Implicit Euler Method) 相比之下,隐式欧拉法则是在新位置处评估导数,这通常意味着需要通过迭代或其他方式求解非线性方程组得到新的估计值。公式如下所示: \[ y_{n+1} = y_n + h \cdot f(t_{n+1}, y_{n+1}) \] 这种方法具有更好的稳定特性,尤其适用于处理刚性问题中的大时间步长情况[^2]。 下面是一个简单的例子展示如何应用牛顿法来找到满足上述公式的\(y_{n+1}\): ```python from scipy.optimize import newton def implicit_euler(f, df_dy, t0, y0, h, n): """ 使用隐式欧拉方法求解ODE. 参数: f : 函数对象, 定义为 dy/dt=f(t,y). df_dy : 关于y偏导数df/dy. t0 : 初始时间点. y0 : 初始条件y(t0)=y0. h : 时间步长. n : 步数. 返回: ts : 所有时间节点列表. ys : 对应于ts的解决方案列表. """ def residual(y_next_guess, current_t, current_y): """定义残差函数""" return current_y + h*f(current_t+h, y_next_guess)-y_next_guess ts = [t0] ys = [y0] for _ in range(n): tn = ts[-1] yn = ys[-1] # 解决非线性方程获得下一次更新 next_y = newton(lambda y:residual(y,tn,yn), yn) ys.append(next_y) ts.append(tn+h) return ts, ys ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值