我的任务是找到光束的最大偏转。我需要返回一个双元素元组,它具有光束的最大偏转和发生它的点x。我已经创建了一个函数getTotalDeflection,它返回多个负载下任意点x的总偏转。我现在需要运行getMaxDeflection函数并找到x的值,其总偏差最大然后将该值和x放在2元素元组中。
import scipy.optimize as s
class beam(object):
def __init__(self, E, I, L):
self.E = E
self.I = I
self.L = L
self.Loads = (0.0, 0.0)
self.name = "beam"
def setLoads(self, Loads):
self.Loads = Loads
def beamDeflection(self, Load, x):
P1, a = Load
L = self.L
I = self.I
E = self.E
b = (self.L - a)
if x > a:
return ((P1*b)/(6*L*I*E)) * ((L/b)*((x-a)**3)-(x**3)+((L**2)-(b**2))*x)
else:
return ((P1*b*x)/(6*L*I*E)) * ((L**2)-(x**2)-(b**2))
def getTotalDeflection(self, x):
return sum(self.beamDeflection(loadall, x) for loadall in self.Loads)
def getMaxDeflection(self):
a = s.brentq(self.getTotalDeflection, 0.0, self.L)
return a
我有点卡住,因为我知道使用scipy.optimize,但我的函数返回0.0。
b = beam(8.0E9,1.333E-4,5.0)
b.setLoads([(900,3.1),(700,3.8),(1000,4.2)])
b.getTotalDeflection(x)的
任何帮助将不胜感激。再次感谢:)
答案 0 :(得分:0)
TL; DR :
max((self.getTotalDeflection(x), x) for x in x_vals)
<强>解释强>:
设置光束:
b = beam(8.0E9, 1.333E-4, 5.0)
b.setLoads([(900, 3.1), (700, 3.8), (1000, 4.2)])
x_vals = (1, 2, 3, 4, 5) # mockup values
我仍然不确定x
的值是否可以接受,所以让我们使用x_vals
中的示例值。
我们可以为(deflection, x)
中的每个值生成一个x_vals
元组列表,如下所示:
def_x_pairs = [(b.getTotalDeflection(x), x) for x in x_vals] # [(0.002266357214303576, 1), (0.003904432358089522, 2), (0.00428594336084021, 3), (0.0028860246311577893, 4), (0.0, 5)]
获取具有最大第一个元素的tuple
很简单:
max_d = max(def_x_pairs) # (0.00428594336084021, 3)
第一个元素是最大总偏转值,第二个元素是相应的x值。
将所有内容放在一起用于方法:
def get_max_deflection(x_vals):
''' x_vals: iterable x-values
returns (max_deflection, x_value) tuple '''
return max((self.getTotalDeflection(x), x) for x in x_vals)