from sympy.mpmath import *
我正在构建一个梁模型,但是我遇到了一些问题 - 最后一部分 - getSlope。否则,其余的应该没问题。
class beam(object):
"""Model of a beam.
"""
def __init__(self, E, I, L):
"""The class costructor.
"""
self.E = E # Young's modulus of the beam in N/m^2
self.I = I # Second moment of area of the beam in m^4
self.L = L # Length of the beam in m
self.Loads = [(0.0, 0.0)] # the list of loads applied to the beam
def setLoads(self, Loads):
'''This function allows multiple point loads to be applied to the beam
using a list of tuples of the form (load, position)
'''
self.Loads = Loads
以上不需要任何调整,因为它已经给出。
def beamDeflection(self, Load, x):
"""A measure of how much the beam bends.
"""
a = 2.5
b = a + (x - a)
(P1, A) = Load
if 0 <= x <= a:
v = ((P1*b*x)/(6*self.L*self.E*self.I))*((self.L**2)-(x**2)-(b**2))
else:
if a < x <= 5:
v = ((P1*b)/(6*self.L*self.E*self.I)) * (((self.L/b)*((x-a)**3)) - (x**3) + (x*((self.L**2) - (b**2))))
return v
上面的函数'beamDeflection'是我做过的一些简单的硬编码,如果在左侧放置一个负载,那么使用某个公式,如果负载在另一侧,那么使用不同的公式。
def getTotalDeflection(self, x):
"""A superposition of the deflection.
"""
return sum(self.beamDeflection(loadall, x) for loadall in self.Loads)
'getTotalDeflection'计算在其上放置多个载荷时的总偏转。
def getSlope(self, x):
"""Differentiate 'v' then input a value for x to obtain a result.
"""
mp.dps = 15
mp.pretty = True
theta = sympy.diff(lambda x: self.beamDeflection(self.Loads, x), x)
return theta
b = beam(8.0E9, 1.333E-4, 5.0)
b.setLoads([(900, 3.1), (700, 3.8), (1000, 4.2)])
print b.getSlope(1.0)
对于这个函数,我应该区分'beamDeflection'或'v',就像我在多个负载下定义的那样,然后输入x的值来找到梯度/斜率。
我正在遵循这个:“http://docs.sympy.org/dev/modules/mpmath/calculus/differentiation.html”要区分,但它需要第二个参数(它似乎是一个整数)才能工作,所以我不认为这是区分它的正确方法。有人可以对此有所了解吗?
答案 0 :(得分:0)
首先,进入good habit of not importing things with a star。
这是一个来自同情套餐的实际例子。
from sympy import * # imports the symbol pi
>>> type(pi) # can be used to construct analytical expressions
<class 'sympy.core.numbers.Pi'>
>>> 2*pi
2*pi
>>> from sympy.mpmath import * # imports a different pi and shadows the previous one
>>> type(pi) # floating point precision of the constant pi
<class 'sympy.mpmath.ctx_mp_python.constant'>
>>> 2*pi
mpf('6.2831853071795862')
总的来说,我建议您使用from sympy import mpmath as mp
,然后您可以使用该套餐中的任何内容,例如:mp.diff()
,mp.pi
等。
sympy.mpmath.diff()
(或从现在开始的mp.diff()
)在某个点x计算函数的导数。您需要提供至少两个必填参数; x和x的函数,兴趣点。
如果您的功能类似于getTotalDeflection()
,只有x
输入,则可以按原样传递。例如,
def getSlope(self, x):
return mp.diff(self.getTotalDeflection, x)
但是,如果你想使用像beamDeflection()
这样的函数,你只需要encapsulate it in a function x
,而你却以某种方式传递另一个参数。例如,
def getSlope(self, x, load):
f_of_x = lambda x: self.beamDeflection(load, x)
return mp.diff(f_of_x, x)
根据您设置方法beamDeflection()
的方式,参数Load
是两个值的元组,即加载和位置。一个示例用途是
b.getSlope(1.0, (900, 3.1))
如果你想获得一个载荷列表的衍生物,你必须给它一个列表(或元组)列表。
def getSlope(self, x, loads):
f_of_x = lambda x: sum(self.beamDeflection(load, x) for load in loads)
return mp.diff(f_of_x, x)
b.getSlope(1.0, [(900, 3.1), (700, 3.8)])
当然,如果您要使用的负载是存储在self.Loads
中的负载,那么您只需使用
def getSlope(self, x):
return mp.diff(self.getTotalDeflection, x)