如何在中设置优化变量分辨率scipy.optimize.minimize公司

2024-10-01 09:27:40 发布

您现在位置:Python中文网/ 问答频道 /正文

背景:使用24条系泊缆和4个护舷将船舶停泊在码头上。这些系泊缆需要由经验丰富的工程师将其预紧到设计值。通过设置每个系泊缆的适当长度来完成预张紧。进行静态模拟,以获得缆绳上的张力和挡泥板上的压缩。这是一个迭代过程,因为系泊缆长度的微小变化可能会导致张力的显著变化。在

Simulation setup

问题描述: 建立了一个目标函数,将系泊缆长度作为输入数组,并返回目标值与已实现预张力值之间的绝对差值之和。在

现在,我正在使用scipy.optimize.minimize.最小化具有以下选项的功能:

target_wire_lenghts = {'Line1': (48.0, 49.0),'Line2': (48.0, 49.0),'Line3': (45.0,46.0),
                       'Line4': (10.0,11.0),'Line5': (8.0,9.0),'Line6': (7.0,8.0),
                       'Line7': (46.0,47.0),'Line8': (48.0,49.0),'Line9': (50.0,51.0),
                       'Line10': (33.0,34.0),'Line11': (31.0,32.0),'Line12': (29.0,30.0),
                       'Line13': (32.0,33.0),'Line14': (34.0,35.0),'Line15': (36.0,37.0), 
                       'Line16': (48.0,49.0),'Line17': (46.0,47.0),'Line18': (45.0,46.0),
                       'Line19': (8.0,9.0), 'Line20': (8.0,9.0), 'Line21': (9.0,10.0),
                       'Line22': (44.0,45.0),'Line23': (45.0,46.0), 'Line24': (46.0,48.0)}

# Bounds
bounds = list(target_wire_lenghts.values())
# Initial guess
x0 = [np.mean([min, max], axis=0) for min,max in bounds]

# Options
options = {'ftol' : 0.1,
           'xtol' : 0.1,
           'gtol' : 0.1,
           'maxiter' : 100,
           'accuracy' : 0.1}

result = minimize(objfn, x0, method = 'TNC', bounds = bounds, options =         options)
print(result)

但是,优化器不会改变输入数组。结果与初始输入数组x0相同(参见下面的length列)。我尝试过使用“TNC”解算器的可选容差参数,但没有看到任何改进。另外,请注意,即使我已经设置了maxiter = 100,迭代还是到了130。在

Results

请指出我在调用minimize函数时犯了什么错误。在

编辑:我认为优化正在运行,但是每次将变量更改0.000001。选项参数eps(用于雅可比矩阵数值逼近的步长)。当设置为0.01时,优化看起来可行。不幸的是,它仍然未能达成合理的解决办法。我试着做一个无界的优化,最初的猜测x0非常接近答案(我通过手动改变每个变量发现了这一点),然后优化器能够给出比我手动的更好的解决方案。在

所以现在的问题是如何在初始猜测错误的情况下快速进行24变量优化?多目标优化能成为答案吗?达到每条线的预张力是一个目标?在


Tags: 函数target目标选项数组minmaxoptions