繁体   English   中英

Sympy:求解非线性方程

[英]Sympy: solving non linear equation

我想解决这个非线性方程:f100 = omega_nf_eq

其中:f100:数值costant,现在定义为变量。

omega_nf_eq:方程式。

首先,我试图用sybolically解决它,我的代码是:

import sympy as sym

K_u, K_m = sym.symbols('K_u, K_m', real = True)
J_p1, J_p2, J_g1, J_g2, J_r, J_u, J_m, J_p12, J_g12, J_gb, J_2, J_1, J_p = sym.symbols('J_p1, J_p2, J_g1, J_g2, J_r, J_u, J_m, J_p12, J_g12, J_gb, J_2, J_1, J_p', real = True)
tau_1, tau_2 = sym.symbols('tau_1, tau_2', real = True)
omega_nf, f100 = sym.symbols('omega_nf, f100', real = True)


omega_nf_eq = sym.Eq(omega_nf, sym.sqrt(2)*sym.sqrt(K_m/(J_g2*tau_2**2 + J_p1 + J_p2) + K_u/(J_g2*tau_2**2 + J_p1 + J_p2) + K_u/(tau_2**2*(J_g1 + J_u)) + K_m/J_m - sym.sqrt(J_m**2*K_m**2*tau_2**4*(J_g1 + J_u)**2 + 2*J_m**2*K_m*K_u*tau_2**4*(J_g1 + J_u)**2 - 2*J_m**2*K_m*K_u*tau_2**2*(J_g1 + J_u)*(J_g2*tau_2**2 + J_p1 + J_p2) + J_m**2*K_u**2*tau_2**4*(J_g1 + J_u)**2 + 2*J_m**2*K_u**2*tau_2**2*(J_g1 + J_u)*(J_g2*tau_2**2 + J_p1 + J_p2) + J_m**2*K_u**2*(J_g2*tau_2**2 + J_p1 + J_p2)**2 + 2*J_m*K_m**2*tau_2**4*(J_g1 + J_u)**2*(J_g2*tau_2**2 + J_p1 + J_p2) - 2*J_m*K_m*K_u*tau_2**4*(J_g1 + J_u)**2*(J_g2*tau_2**2 + J_p1 + J_p2) - 2*J_m*K_m*K_u*tau_2**2*(J_g1 + J_u)*(J_g2*tau_2**2 + J_p1 + J_p2)**2 + K_m**2*tau_2**4*(J_g1 + J_u)**2*(J_g2*tau_2**2 + J_p1 + J_p2)**2)/(J_m*tau_2**2*(J_g1 + J_u)*(J_g2*tau_2**2 + J_p1 + J_p2)))/2)



solution = sym.solve(f100 - omega_nf_eq.args[1], J_u, dict = True) 

但这给了我这个结果:[]。

我也尝试替换除了J_u之外的所有变量值,这是我想要的。 所以现在omega_nf方程是:

omega_nf_eq = sym.Eq(omega_nf, sym.sqrt(2)*sym.sqrt(76019006.3529542 - 84187769.0684942*sym.sqrt(0.813040126459949*J_u**2 - 4.69199504596906e-5*J_u + 1.03236146920168e-9)/J_u + 2704.98520837442/J_u)/2)

所以要解决我现在尝试过:

solution = sym.solve( 942.5 - omega_nf_eq.args[1], J_u,, dict = True, force=True, manual=True, set=True)

它现在有效,但需要几分钟。

所以我试图用数字来解决它,加速这个过程,用sympy.nsolve(); 这是代码:

omega_nf_eq = sym.Eq(omega_nf, sym.sqrt(2)*sym.sqrt(76019006.3529542 - 84187769.0684942*sym.sqrt(0.813040126459949*J_u**2 - 4.69199504596906e-5*J_u + 1.03236146920168e-9)/J_u + 2704.98520837442/J_u)/2)

eq_solution = sym.nsolve(942.5 - omega_nf_eq, J_u, 0.0071, verify=False)

但我没有得到正确的结果,即:J_u = 0.00717865789803973。

我做错了什么? 有一种更明智的方式来使用sympy?

没有J_u在你的第一个象征性的方程所以这就是为什么你有[]的解决方案。 当您尝试使用数值解法时,您使用了omega_nf_eq (这是一个等式); 我认为你的意思是'nsolve(942.5 - omega_nf_eq.rhs,J_u,.0071)'。 但即使如此,这也不会为你找到一个解决方案,因为这个等式,如同所写,在分母中用J_u表现J_u 如果你使用sympy.solvers.solvers.unrad为你提供无根本的表达式,它的根将包含你感兴趣的那些子集作为一个子集你会发现你只需要解决J_u的二次方...快点

>>> unrad(942.5 - omega_nf_eq.rhs)
(1.0022170762796e+15*J_u**2 - 2936792314038.5*J_u + 2.04890966415405e-7, [])
>>> solve(_[0])
[6.97669240810738e-20, 0.00293029562511584]

我建议你在确定哪个变量对应于J_u后,恢复你的第一个符号表达式并unrad它 - 或者甚至只是尝试解决它。

我已经解决了使用:

sympy.solveset(942.5 - omega_nf_eq.rhs, J_u)

我链接了sympy.solveset()文档 :现在非常快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM