我是固体力学领域的研究人员,就提问方而言,我是这个网站的新手。
我正在尝试使用sympy的nsolve来求非线性代数方程组的解。我的系统有三个非线性方程,其中有三个未知数。每个方程都有一个输入参数'V',我明确指定了这个参数。
i = 7.0
NLE_1 = Nonlinear_eq_1.subs(V, i)
NLE_2 = Nonlinear_eq_2.subs(V, i)
NLE_3 = Nonlinear_eq_3.subs(V, i)
如前所述,Nonlinear_eq_1、Nonlinear_eq_2和Nonlinear_eq_3是a1、a2和a3的函数。现在,该非线性系统的阈值上限为V。我需要找出该临界V值,这是我感兴趣的实际未知数。
对于给定的系统参数,我尝试放大临界V值,如下所示:
一开始,我手动迭代i(没有使用任何循环,例如for循环),使其从0开始以1递增。使用下面的代码行,我找到了非线性方程组的根:
ans_nonlinear = smp.nsolve([NLE_1, NLE_2, NLE_3], [a1, a2, a3], linear_answers)
其中,“linear_answers”是通过仅考虑涉及a1、a2、a3的线性项来求解Nonlinear_eq_1、Nonlinear_eq_2和Nonlinear_eq_3而获得的元组,如下:
ans_linear = smp.solve((LE_1, LE_2, LE_3), (a1, a2, a3))
linear_answers = (float(ans_linear.get(a1)), float(ans_linear.get(a2)), float(ans_linear.get(a3)))
现在,从V = 0到V = 7,我得到了ans_nonlinear的明确答案,但是当V = 8时,nsolve给出了以下错误:
无法在给定的容差内找到根。(2.16855306310932770901e-19〉2.16840434497100886801e-19)请尝试另一个起点或调整参数。
这个错误间接地说明V在7和8之间有一个临界值。
我想知道如何使用此错误,以便可以生成用户定义的标志并抑制错误。我打算使用此标志,以便可以返回V = 7并开始将V递增为7.1、7.2、7.3等。在循环中使用此逻辑,然后将V的临界值磨练到所需的精度。
该问题的实质是利用三模态降阶模型(ROM)求出微悬臂梁的静态pull-in失稳参数。
2条答案
按热度按时间p4tfgftt1#
我建议你使用bisection来寻找临界值。你的bisection函数可能会返回一个解,如果没有,则返回None。当你的边界足够接近时,停止bisection。例如,如果你有一个方程
eq
,需要指定一个参数v
,并且你有一个解的猜测g
。下面是一个玩具一维例子:产出
kpbwa7wx2#
@smichr感谢您提供的有用提示。我认为扫描V值比使用平分法获得临界V值更准确。
@Oscar Benjamin我感谢你的评论。由于之前对我的问题的评论,我现在更清楚如何使用try/except来找出关键的V值。以下是我的Python代码的相关部分,供你参考。