0

我推导出了一些带有一些变量的方程。我想解决一个未知变量。我正在使用 Sympy。我的代码如下:

import sympy as syp

import math as m
#this is the unknown variable that I want to find
C0 = syp.Symbol('C0')
#Known variables
D0 = 0.874

theta2 = 10.0
fi2 = 80.0

theta1 = (theta2/180.0)*m.pi
fi1 = (fi2/180.0)*m.pi
#Definitions of 6 different equations all of them in respect to CO.
C_t = 5*m.pi*(D0+4*C0)

St123 = 1.5*theta1*(D0+2*C0)

St45 = fi1*(D0+7*C0)

l1 = syp.sqrt((0.5*(D0+4*C0)-0.5*D0*m.cos(theta1))**2 + (0.5*D0*m.sin(theta1))**2)

l2 = syp.sqrt((0.5*(D0+6*C0)-0.5*(D0+2*C0)*m.cos(theta1))**2 + (0.5*(D0+2*C0)*m.sin(theta1))**2)

l3 = syp.sqrt((0.5*(D0+8*C0)-0.5*(D0+4*C0)*m.cos(theta1))**2 + (0.5*(D0+4*C0)*m.sin(theta1))**2)
#Definition of the general relationship between the above functions. Here C0 is unknown and C_b
C_b = C_t + 6*C0 + 3*(l1+l2+l3) - 3*St123 - 3*St45
#for C_b = 10.4866, find C0
syp.solve(C_b - 10.4866, C0)

正如所观察到的,我想解决 C_b 与 C0 的关系。直到最后一行我的代码工作正常。当我运行整个脚本时,计算 C0 似乎需要很长时间。我没有任何警告信息,但我也没有任何解决方案。有人会提出替代方案或可能的解决方案吗?提前非常感谢。

4

1 回答 1

1

正如我在评论中提到的,这个问题本质上是数字的,所以最好尝试用 numpy/scipy 解决它。尽管如此,这是一个有趣的例子,说明如何在 sympy 中做数字,所以这里是一个建议的工作流程。

首先,如果不是因为这里表达式的相对复杂性,scipy 绝对是比 sympy 更好的选择。但是表达式相当复杂,因此我们可以先将其简化,sympy然后再将其输入scipy

>>> C_b
38.0∗C0
+3.0∗((0.17∗C0+0.076)∗∗2+(2.0∗C0+0.0066)∗∗2)∗∗0.5
+3.0∗((0.35∗C0+0.076)∗∗2+(2.0∗C0+0.0066)∗∗2)∗∗0.5
+3.0∗((2.0∗C0+0.0066)∗∗2+0.0058)∗∗0.5
+9.4

>>> simplify(C_b)
38.0∗C0
+3.0∗(4.0∗C0∗∗2+0.027∗C0+0.0058)∗∗0.5
+3.0∗(4.1∗C0∗∗2+0.053∗C0+0.0058)∗∗0.5
+3.0∗(4.2∗C0∗∗2+0.08∗C0+0.0058)∗∗0.5
+9.4

现在考虑到您对符号不感兴趣并且简化不是那么好,继续使用 sympy 而不是 scipy 是没有用的,但是如果您坚持可以做到。

>>> nsolve(C_b - 10.4866, C0, 1) # for numerical solution
0.00970963412692139

如果你尝试使用solve而不是nsolve你只会浪费大量资源来寻找一个符号解决方案(在基本术语中甚至可能不存在)当一个数字是瞬时的。

于 2013-04-19T13:06:42.323 回答