【问题标题】:How to use argmin() and find minimum value from array如何使用 argmin() 并从数组中找到最小值
【发布时间】:2022-01-24 11:59:15
【问题描述】:

我是 python 新手,所以代码可能不是最好的。我试图找到最低总成本 (TotalC) 以及与此最低成本相关的相应 m、k 和 xM 值。我不知道该怎么做。我尝试使用 min(TotalC) 但这会在循环内或循环外产生错误,仅返回 TotalC 的值,而不是相应的 m、k 和 xM 值。任何帮助,将不胜感激。这部分在代码的末尾,我已经包含了我的整个代码。

我尝试过使用

minIndex = TotalC.argmin()

但不知道怎么用,每次只返回0。

import numpy as np
import matplotlib.pyplot as plt


def Load(x):
    Fpeak = (1000 + (9*(x**2) - (183*x))) *1000     #Fpeak in N
    td = (20 - ((0.12)*(x**2)) + (4.2*(x))) / 1000  #td in s
    
    return Fpeak, td

#####################################################################################################
####################### Part 2 ########################

def displacement(m,k,x,dt):           #Displacement function

    Fpeak, td = Load(x)               #Load Function from step 1
    
    w = np.sqrt(k/m)                  # Natural circular frequency
    T = 2 * np.pi /w                  #Natural period of blast (s)
    time = np.arange(0,2*T,0.001)     #Time array with range (0 - 2*T) with steps of 2*T/100
    
    
    zt = []                           #Create a lsit to store displacement values
    for t in time:
            if (t <= td):
                zt.append((Fpeak/k) * (1 - np.cos(w*t)) + (Fpeak/(k*td)) * ((np.sin(w*t)/w) - t))
            else:
                zt.append((Fpeak/(k*w*td)) * (np.sin(w*t) - np.sin(w*(t-td))) - ((Fpeak/k) * np.cos(w*t))) 
                
    
    zmax=max(zt)            #Find the max displacement from the list of zt values
    return zmax             #Return max displacement

k = 1E6
m = 200
dt = 0.0001
x = 0


z = displacement(m,k,x,dt)

###################################################################################
############### Part 3 #######################
# k = 1E6 , m = 200kg , Deflection = 0.1m


k_values = np.arange(1E6, 7E6, ((7E6-1E6)/10))   #List of k values between min and max (1E6 and 7E6).
m_values = np.arange(200,1200,((1200-200)/10))   #List of m values between min and max 200kg and 1200kg

xM = []

for k in k_values: # values of k
    for m in m_values: # values of m within k for loop
    

        def bisector(m,k,dpoint,dt):  #dpoint = decimal point accuracy
             xL = 0
             xR = 10
             xM = (xL + xR)/2
             zmax = 99

             while round(zmax, dpoint) !=0.1:
                 zmax = displacement(m,k,xM,dt)
                 if zmax > 0.1:
                     xL = xM
                     xM = (xL + xR)/2
                 else:
                     xR = xM
                     xM = (xL + xR)/2
             return xM

        xM = bisector(m, k, 4, 0.001)
        print('xM value =',xM)
#####################################################
    #######Step 4
        def cost (m,k,xM):
        
            Ck = 900 + 825*((k/1E6)**2) - (1725*(k/1E6))
            Cm = 10*m - 2000
            Cx = 2400*((xM**2)/4)
            TotalC = Ck + Cm + Cx
            minIndex = TotalC.argmin(0)
            print(minIndex)
            return TotalC
    
        TotalC = cost(m, k, xM)
        minIndex = TotalC.argmin()
        print(minIndex)
    
        print([xM, m, k, TotalC])

【问题讨论】:

    标签: python numpy min


    【解决方案1】:

    argmin() 返回最小值的索引。如果您正在寻找最小值本身,请尝试使用.min()。 0 也有可能是您的数组中的最小值,因此请记住这一点

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 2016-02-12
      • 2022-01-16
      • 2014-06-01
      • 2015-07-07
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多