Доступ к переменным в функции оптимизации извне - PullRequest
0 голосов
/ 23 июня 2019

Я запускаю оптимизацию с использованием scipy.optimize.differential_evolution. Внутри функции оптимизации я вызываю другую функцию. Я хочу получить возвращаемые значения внутренней функции извне оптимизации.

from scipy.optimize import differential_evolution
import numpy as np

def test():
    a = 5
    b = 10
    ab = a + b
    ab2 = a + b**2
    return ab, ab2


def ackley(x):

    arg1 = -0.2 * np.sqrt(0.5 * (x[0] ** 2 + x[1] ** 2))
    arg2 = 0.5 * (np.cos(2. * np.pi * x[0]) + np.cos(2. * np.pi * x[1]))

    global Value1, Value2
    Value1, Value2 = test()

    return -20. * np.exp(arg1) - np.exp(arg2) + 20. + np.e

if __name__ == "__main__":
    bounds = [(-5, 5), (-5, 5), (-5, 5), (-5, 5), (-5, 5), (-5, 5), (-5, 5)]
    result = differential_evolution(ackley, bounds, args=(), workers=-1)

    print(Value1, Value2)

Хотя приведенный выше код работает, приведенный ниже эквивалентный сбой при печати значений1 и значений2.

import numpy as np
import math
from reference_section import ref_section

def test():
    a = 5
    b = 10
    ab = a + b
    ab2 = a + b**2
    return ab, ab2

def Objective(coeff):

    n = 8  
    m = 100  
    x = 0.5 * (1 - np.cos(np.linspace(0, np.pi, m))) 

    BPn_list = []
    for r in range(0, n + 1):
        BPn_terms = (math.factorial(n) / (math.factorial(r) * math.factorial(n - r))) * (x ** r) * ((1 - x) ** (n - r))
        BPn_list.append(BPn_terms.tolist())

    N1 = 0.5
    N2 = 1
    c = 1
    Zte = 0.00126 * 2

    # ----------------------
    Class_function = []
    ND_TE_ratio_upper = []
    for items in x:
        C = ((items / c) ** N1) * ((1 - (items / c)) ** N2)
        Class_function.append(C)
        TE = (items / c) * ((Zte / 2) / c)
        ND_TE_ratio_upper.append(TE)
    ND_TE_ratio_lower= [-i for i in ND_TE_ratio_upper]
    # -----------------------------------------------------------------------------
    Aui = [np.sqrt((2 * coeff[0]) / c), coeff[1], coeff[2], coeff[3], coeff[4], coeff[5], coeff[6], coeff[7], np.tan(np.deg2rad(coeff[8])) + (Zte / c)]
    Ali = [np.tan(np.deg2rad(coeff[9])) + (Zte / c), coeff[10], coeff[11], coeff[12], coeff[13], coeff[14], coeff[15], coeff[16], -Aui[0]]
    # ------------------------------------------------------------    
    UpperSurf = [sum(x) for x in zip([x*y for x,y in zip(Class_function,[sum(x) for x in zip(*[[Aui[i] * j for j in sub] for i, sub in enumerate(BPn_list)])])], ND_TE_ratio_upper)]
    LowerSurf = [sum(x) for x in zip([x*y for x,y in zip(Class_function,[sum(x) for x in zip(*[[Ali[i] * j for j in sub] for i, sub in enumerate(BPn_list)])][::-1])], ND_TE_ratio_lower)]
    y_prediction = np.append(UpperSurf[::-1], LowerSurf[1:])

    global Value1, Value2
    Value1, Value2 = test()

    return np.sum(np.sqrt(np.array(y_reference - y_prediction)**2.0))

if __name__ == "__main__":

    y_reference, suctReference, pressReference = ref_section("ref.dat")

    BOUNDS = [(0.0 , 0.1), (0.0 , 0.5), (0.0 , 0.5), (0.0 , 0.5), (0.0 , 0.5), (0.0 , 0.5), (0.0 , 0.5), (0.0 , 0.5), (0.0 , 50.0),
              (-50.0 , 50.0), (0.1 , -0.5), (0.1 , -0.5), (0.1 , -0.5), (0.0 , -0.5), (0.0 , -0.5), (0.0 , -0.5), (0.0 , -0.1)]

    from scipy.optimize import differential_evolution
    result = differential_evolution(Objective, BOUNDS, maxiter=100, disp=True, workers=-1)


    print(Value1, Value2)

1 Ответ

0 голосов
/ 23 июня 2019

Определите ваши переменные в глобальной области видимости до вызова функции, например, так:

if __name__ == "__main__":
    n = m = x = N1 = N2 = c = Zte = Rle = Beta_TE = 0
    UpperSurf = []; LowerSurf = []; suctReference = []; pressReference = [];
...