Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在解决多变量问题时提高Python优化速度_Python_Optimization_Scipy - Fatal编程技术网

如何在解决多变量问题时提高Python优化速度

如何在解决多变量问题时提高Python优化速度,python,optimization,scipy,Python,Optimization,Scipy,我试图在求解静态模拟时获得24个变量的值。每个变量表示24根导线的长度,我试图通过此优化获得导线上的预设张力。更改一条导线的长度会影响所有其他导线的张力 目前,我正在使用scipy.optimize模块中的Nelder-Mead方法的最小化函数。我的目标函数是预设张力和实现张力值之间的绝对差值之和(使用商业软件在objfn中计算) 即使经过3000次迭代,解算器也无法找到足够接近的解。当涉及这么多变量时,关于应使用哪种优化方法的任何建议,这些变量需要在精度为0.01的情况下变化±5 import

我试图在求解静态模拟时获得24个变量的值。每个变量表示24根导线的长度,我试图通过此优化获得导线上的预设张力。更改一条导线的长度会影响所有其他导线的张力

目前,我正在使用scipy.optimize模块中的Nelder-Mead方法的最小化函数。我的目标函数是预设张力和实现张力值之间的绝对差值之和(使用商业软件在objfn中计算)

即使经过3000次迭代,解算器也无法找到足够接近的解。当涉及这么多变量时,关于应使用哪种优化方法的任何建议,这些变量需要在精度为0.01的情况下变化±5

import OrcFxAPI
import os
import numpy as np
import scipy as sp
from scipy.optimize import minimize

#-------------------------------------------------------------------------------
fileName = 'Jetty_Mooring.dat'
model = OrcFxAPI.Model(fileName)


# Target Pretension Values
#-------------------------------------------------------------------------------
target_pretensions = {'Line1': 91.0,'Line2': 91.0,'Line3': 91.0,'Line4': 49.0,
                      'Line5': 49.0,'Line6': 49.0,'Line7': 59.0,'Line8': 60.0,
                      'Line9': 60.0,'Line10': 68.0,'Line11': 68.0,'Line12': 68.0,
                      'Line13': 57.0,'Line14': 57.0,'Line15': 57.0, 'Line16': 55.0,
                      'Line17': 55.0,'Line18': 54.0,'Line19': 48.0, 'Line20': 48.0,
                      'Line21': 48.0,'Line22': 89.0,'Line23': 88.0, 'Line24': 89.0,
                      'Fender 1': - 200.0,'Fender 2': - 202.0, 
                      'Fender 3': - 206.0, 'Fender 4': - 207.0}

def objfn(wire_lengths):


    for i in range(24):
        line = model['Line' + str(i+1)]
        line.Length[0] = wire_lengths[i]

    try:
        model.CalculateStatics()


        # difference between targe and achieved pretension
        diff = 0
        achieved_pretension = {}
        for i in range(24):
            line = model['Line' + str(i+1)]
            pretension = line.StaticResult('Effective Tension', OrcFxAPI.oeEndA)
            achieved_pretension['Line' + str(i+1)] = pretension
            diff = diff + abs(target_pretensions['Line' + str(i+1)] 
                                    - achieved_pretension['Line' + str(i+1)])

        for i in range(4):
            fender = model['Fender ' + str(i+1)]
            pretension = fender.StaticResult('Tension')
            achieved_pretension['Fender '+ str(i+1)] = pretension
            diff = diff + abs(target_pretensions['Fender ' + str(i+1)] 
                                    - achieved_pretension['Fender ' + str(i+1)])

    except:
        print('OrcaFlex Static calculation not converged.')
        #input('>')
        return 1E8  # Returning a very large number in case of error

    return diff

# Initial condition
x0 = {'Line1': 48.3089,'Line2': 46.7486,'Line3': 45.6178,
                       'Line4': 10.2308,'Line5': 8.0667,'Line6': 6.8685,
                       'Line7': 46.6303,'Line8': 48.7554,'Line9': 50.5218,
                       'Line10': 33.3988,'Line11': 31.5107,'Line12': 29.5331,
                       'Line13': 31.9916,'Line14': 34.0526,'Line15': 35.8218, 
                       'Line16': 48.4918,'Line17': 46.8255,'Line18': 44.8937,
                       'Line19': 8.5358, 'Line20': 8.3543, 'Line21': 8.9467,
                       'Line22': 44.2500,'Line23': 45.7275, 'Line24': 47.50}
x0=list(x0.values())

# Nelder-Mead
result = minimize(objfn, x0, method = 'Nelder-Mead', options = {'disp': True,'ftol':0.001,'eps':0.1})


print(result)

编辑:因为很多评论者想看到目标函数,所以我在这里添加了全部代码。请注意,运行模型
Jetty_系泊.dat
以获得目标函数中使用的结果需要软件OrcaFlex。不过,这应该能让你对问题有一些了解。

“Nealder-Mead算法是用来解决低维问题的。”建议最多6个,也许8个(来自以下答案):你对适合我的问题的方法有什么建议吗?试试其他优化器。但如果你不展示objfn,那只是猜测-work@sascha:目标函数是abs(目标张力-实现张力)之和。张力值通过使用软件OrcaFlex求解静态分析获得。你可以在这里看到对问题的完整描述:你难道没有想到,当你对其他问题没有反应时,你的问题描述是不完整的,而这里的人们也在挣扎吗<代码>目标张力可以是一切,对于
实现的张力
也是如此。可能至少有一个是非常数的。但是谁知道呢?“Nealder-Mead算法是用来解决低维问题的。”6是建议的最大值,可能是8(来自于:)你对我的问题的合适方法有什么建议吗?试试其他的优化器。但如果你不展示objfn,那只是猜测-work@sascha:目标函数是abs(目标张力-实现张力)之和。张力值通过使用软件OrcaFlex求解静态分析获得。你可以在这里看到对问题的完整描述:你难道没有想到,当你对其他问题没有反应时,你的问题描述是不完整的,而这里的人们也在挣扎吗<代码>目标张力可以是一切,对于
实现的张力
也是如此。可能至少有一个是非常数的。但是谁知道呢。。。