2015-12-17 64 views
1

我的任務是查找光束的最大偏轉。我需要返回一個兩個元素元組,其中梁的最大偏轉和它發生的點x。我做了一個函數getTotalDeflection,它返回多個載荷下任意點x處的總撓度。我現在需要使用我的getMaxDeflection函數來運行並找到總偏轉最大的x的值,然後在2元組元組中呈現此值和x。查找給定數量輸入的函數的最大返回值和相應的輸入

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 =光束(8.0E9,1.333E-4,5.0)

b.setLoads([(900,3.1),(700,3.8),(1000,4.2)])

b.getTotalDeflection(X)

任何幫助,將不勝感激。再次謝謝:)

+0

所以你需要檢查列表具有結構'[(deflection1,X1),(deflection2,X2),...]'? – timgeb

+0

可能。這是查看它的一種方式,但是然後maxDeflection函數將不得不將每個可能的x值插入getTotalDeflection從0到5,以找到最大的總偏轉。 – jajabinks

+0

但是,目前還沒有一個名單@timgeb。 – jajabinks

回答

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) 
+0

它應該通過x_vals的所有可能值來查找絕對最大值,因此更準確。這個例子應該是(0.004342733854787473,2.7473228262151577)。 – jajabinks

+0

@jajabinks這就是我給你的方法。你可以將任何'x_vals'的迭代傳遞給它。 – timgeb

+0

那麼我該怎麼做呢?我想要0-5的x值,5是L.非常感謝你的幫助。非常感謝。 – jajabinks

相關問題