查找函数的最大返回值以及给定数量输入的相应输入

时间:2015-12-17 18:33:16

标签: python optimization

我的任务是找到光束的最大偏转。我需要返回一个双元素元组,它具有光束的最大偏转和发生它的点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)的

  

任何帮助将不胜感激。再次感谢:)

1 个答案:

答案 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)