稳定解与鞍点解交点处临界力$F_{cr}$的求解(解析/数值方法)
嘿,我来帮你拆解这个问题——你手里的自由能函数精准描述了可逆键连接的双底物在外力下拉扯的热力学行为,而且已经通过数值解找到了稳定的极小值分支(实线)和鞍点分支(虚线),现在核心目标是搞清楚这两个分支交点处临界力$F_{cr}$的数学本质,以及如何得到它和$\kappa_b$的关系,不管是解析表达式还是数值曲线都可以。
一、交点处的数学本质:鞍结分岔
当两个分支在$F=F_{cr}$处相交时,这其实是**鞍结分岔(saddle-node bifurcation)**的典型场景:原本两个不同的解(稳定极小值和鞍点)在临界力下合并为一个解,此时系统的自由能景观发生了质变——超过这个力之后,只有底物完全分离的解($N_b=0$)是稳定的。
从数学上看,这个临界点满足三个核心条件:
- 两个解的状态变量完全重合:$N_b{(1)}=N_b{(2)}=N_b{cr}$,$l_b{(1)}=l_b{(2)}=l_b{cr}$
- 自由能的一阶偏导条件仍然成立(毕竟这是解的必要条件):$\partial G/\partial N_b=0$ 和 $\partial G/\partial l_b=0$
- Hessian矩阵的行列式为0:因为分岔点处,Hessian的一个特征值会变为0,这是极小值和鞍点合并的标志性信号——原本极小值的Hessian特征值全正,鞍点的Hessian有一个负特征值,合并时负特征值趋近于0。
二、解析求解$F_{cr}$的思路
我们先把你的自由能函数、一阶偏导、Hessian矩阵明确下来,再联立方程推导:
你的自由能函数:
$$G(N_b, l_b)= -N_b E_b + \frac{1}{2} N_b \kappa_b (l_b - 1)^2 - F(l_b - 1) + \frac{A}{2} k_g (u_g - l_b)^2 + (N_t - N_b) \text{Log}\big(\frac{N_t - N_b}{A}\big) + N_b \text{Log}\big(\frac{N_b}{A}\big)$$
1. 一阶偏导条件(平衡方程)
整理后可以得到:
- $\frac{\partial G}{\partial N_b} = -E_b + \frac{1}{2}\kappa_b(l_b-1)^2 + \ln\left(\frac{N_b}{N_t - N_b}\right) = 0$
(对数项化简:$\ln(N_b/A) - \ln((N_t-N_b)/A) = \ln(N_b/(N_t-N_b))$) - $\frac{\partial G}{\partial l_b} = N_b \kappa_b(l_b-1) - F - A k_g(u_g - l_b) = 0$
2. Hessian行列式为0的条件
先计算二阶偏导构造Hessian矩阵:
$$
\mathcal{H} = \begin{pmatrix}
\frac{\partial^2 G}{\partial N_b^2} & \frac{\partial^2 G}{\partial N_b \partial l_b} \
\frac{\partial^2 G}{\partial l_b \partial N_b} & \frac{\partial^2 G}{\partial l_b^2}
\end{pmatrix}
$$
其中:
- $\frac{\partial^2 G}{\partial N_b^2} = \frac{1}{N_b} + \frac{1}{N_t - N_b} = \frac{N_t}{N_b(N_t - N_b)}$
- $\frac{\partial^2 G}{\partial N_b \partial l_b} = \kappa_b(l_b - 1)$
- $\frac{\partial^2 G}{\partial l_b^2} = N_b \kappa_b + A k_g$
Hessian行列式为0的条件:
$$
\det(\mathcal{H}) = \left(\frac{N_t}{N_b(N_t - N_b)}\right)(N_b \kappa_b + A k_g) - [\kappa_b(l_b - 1)]^2 = 0
$$
3. 联立方程求解$F_{cr}$
现在我们有三个方程(两个一阶条件+行列式为0),变量是$N_b{cr}$、$l_b{cr}$、$F_{cr}$,其他都是已知参数。理论上可以通过消元法消去$N_b{cr}$和$l_b{cr}$,得到$F_{cr}$关于$\kappa_b$的表达式。不过因为存在对数项,大概率无法得到完全闭合的解析解,最终可能需要用隐函数形式表示,或者针对特定参数范围做近似(比如当$N_b$接近$N_t/2$时的展开)。
三、数值求解$F_{cr}$ vs $\kappa_b$的方法
如果解析推导卡壳,数值方法会更直接高效,这里给你一个清晰的实现思路:
方法1:寻找解重合的临界力
对于每个固定的$\kappa_b$,通过二分法或牛顿法寻找$F_{cr}$:
- 给定一个$F$,解一阶条件方程组,得到$N_b$和$l_b$的两个解(稳定解和鞍点解)
- 当$F < F_{cr}$时,两个解的$N_b$/$l_b$值差异明显;当$F = F_{cr}$时,两个解完全重合;当$F > F_{cr}$时,只有$N_b=0$的解存在
- 通过追踪解的重合点,就能得到对应$\kappa_b$的$F_{cr}$
方法2:直接联立分岔条件求解
直接把三个方程(一阶条件+行列式为0)打包,用多元牛顿法求解$N_b{cr}$、$l_b{cr}$、$F_{cr}$,遍历不同$\kappa_b$即可得到曲线。下面是一个基于Python的伪代码示例:
import numpy as np from scipy.optimize import root import matplotlib.pyplot as plt # 固定参数(和你给出的一致) N_t = 50 E_b = 10 k_g = 2.43902e-6 u_g = 3 A = 100 def bifurcation_equations(vars, kappa_b): N_b, l_b, F = vars # 一阶条件1 eq1 = -E_b + 0.5 * kappa_b * (l_b - 1)**2 + np.log(N_b / (N_t - N_b)) # 一阶条件2 eq2 = N_b * kappa_b * (l_b - 1) - F - A * k_g * (u_g - l_b) # Hessian行列式为0的条件 det_H = (N_t / (N_b * (N_t - N_b))) * (N_b * kappa_b + A * k_g) - (kappa_b * (l_b - 1))**2 return [eq1, eq2, det_H] # 遍历不同的kappa_b值 kappa_b_range = np.linspace(0.5, 15, 60) # 可根据需求调整范围 F_cr_results = [] for kappa_b in kappa_b_range: # 初始猜测值(根据你的现有曲线合理设置) initial_guess = [20, 2.0, 40] solution = root(bifurcation_equations, initial_guess, args=(kappa_b)) if solution.success: F_cr_results.append(solution.x[2]) else: F_cr_results.append(np.nan) # 标记求解失败的点 # 绘制临界力曲线 plt.figure(figsize=(8, 5)) plt.plot(kappa_b_range, F_cr_results, 'o-', color='#1f77b4', markersize=4) plt.xlabel(r'$\kappa_b$', fontsize=12) plt.ylabel(r'$F_{cr}$', fontsize=12) plt.title(r'Critical Force $F_{cr}$ vs Bond Stiffness $\kappa_b$', fontsize=14) plt.grid(alpha=0.3) plt.show()
这个代码可以直接运行(需要安装scipy和matplotlib),调整kappa_b_range的范围就能得到你需要的曲线。
备注:内容来源于stack exchange,提问作者 Klaas-Jan

