我正在尝试使用如下所示的约束和界限来使函数最小化,但是运行它后却出现错误:
TypeError: 'float' object is not subscriptable.
你能告诉我如何避免吗?
我也不确定我是否可以很好地使用主程序 作为一个整体。
import numpy as np
from scipy.optimize import minimize
import matplotlib.pyplot as plt
import sympy as sp
from scipy.integrate import quad
import math
# obj funtion
def f(x):
l = sp.Symbol('l')
Ep = 45000
Gc = 1
F = 1080
ep = x[0]
ec = x[1]
return (((F ** 2 * (l - x)) / (Ep * ec * l * (ec + ep) ** 2)) + (F ** 2) / (2 * (ec + 2 * ec) * Gc * l)) / 100
mainf = quad(f, 0, 1800)
# constrain 1 - mass
def constrain1(x):
pc = 4.5 * 10 ** (-5)
pp = 2.1 * 10 ** (-3)
V = 3.1 * 10 ** 7
ep = x[0]
ec = x[1]
return ((((pp * V * ((2 * ep + ec) / 50) * ep) / (ec + 2 * ep)) + (
(pc * V * ((2 * ep + ec) / 50) * ec) / (ec + 2 * ep))) / 1000) - 4.5
def constrain2(x):
ep = x[0]
ec = x[1]
return (3.13107 * 10 ** 3) * ep * np.sqrt(ep / ec) - 1080
# initial guesses
x_init = [2, 50]
# bounds
b1 = (0, 3)
b2 = (30, 70)
bnds = (b1, b2)
con1 = {'type': 'ineq', 'fun': constrain1}
con2 = {'type': 'ineq', 'fun': constrain2}
cons = [con1, con2]
sol = minimize(mainf,x0=x_init,method='SLSQP',bounds=bnds,constraints=cons)