标签:python python-3-x numpy scipy sympy
我需要解决一个庞大的非线性方程组(静态桁架系统).
方程式来自节点(xyz)及其约束(位置,力).
目前我们正在使用Mathematica完成此任务,但我们希望迁移到Python.
但是使用Mathematica(或EES(工程方程求解器)或SymPy)它非常方便.我把一堆东西放在节点位置或节点上的力上,它做了一些魔术,并通过自己组合输入并解决它们来创建方程式.
如果我想使用scipy.optimize.root我必须以某种方式获得方程式.
scipy.optimize.root和scipy.optimize.fsolve需要以下格式的公式:
def func(x):
out = [x[0]*cos(x[1]) - 4],
x[1]*x[0] - x[1] - 5)
return out
但在我的情况下,将有多达5000个方程式来定义系统.
我想到的一件事就是使用eval()并以某种方式将方程式转换为字符串.
最后,我希望有一种面向对象的方法,其中节点或约束知道如何将自身转换为方程.
一个非常简单的骨架可能是
n = Node(5, 2, 6)
n.to_equation()
f = ForceConstraint(1, 2, 3)
f.to_equation()
这会以某种方式转换为类似的方程式
x[0] - 5,
x[1] - 2,
x[2] - 6,
x[2] ** 2 - x[1] * x[0] # and some non-linear stuff
描述整个系统.
基本上应该有一些神奇的部分来查看方程和约束的匹配部分.
例如.查看Node1 x方向上的所有信息,并将其合并到方程式中,或在Node2上搜索y方向上的力的所有信息.
scipy是否适合这项工作?
有人知道怎么做吗?
解决方法:
我想你可能对symfit
感兴趣.这是我用连接scipy和sympy写的一个包.
我不完全确定你的具体方程式是什么,但是你可以在sympy中写出的任何表达式原则上都可以用于symfit.例如,对于上面的简单示例,您可以编写:
from symfit import parameters, variables, Fit
import numpy as np
x0, x1, x2 = parameters('x0, x1, x2')
y0, y1, y2, y3 = variables('y0, y1, y2, y3')
model_dict = {
y0: x0 - 5,
y1: x1 - 2,
y2: x2 - 6,
y3: x2 ** 2 - x1 * x0
}
fit = Fit(model_dict, y0=np.array(0.0), y1=np.array(0.0), y2=np.array(0.0), y3=np.array(0.0))
fit_result = fit.execute()
print(fit_result)
symfit中的变量和参数对象只是符号符号子类,因此您可以对所需的这些表达式进行所有同情操作.例如,您可以将节点定义为
>>> x, x_0 = symbols('x, x_0')
>>> Node = x - x_0
然后通过重复应用例如制作模型的线条.
>>> Node.subs({x: x1, x_0: 2})
x1 - 2
最后,你添加你的约束和presto:fittable模型!查看docs以获取更多信息或向我询问任何后续问题.
标签:python,python-3-x,numpy,scipy,sympy 来源: https://codeday.me/bug/20190710/1424861.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。