FMUException: Ошибка загрузки двоичного файла. Не удалось загрузить DLL: сбой процедуры инициализации библиотеки динамических ссылок (DLL)

Я использую pyfmi для загрузки сгенерированной модели Modelica в Python. После загрузки модели я хочу выполнить оптимизацию и оценку параметров. Проблема заключается в том, что для каждой оценки параметров (итерации оптимизации) FMU необходимо загружать обычно, ему требуется около 300-400 итераций, но он не сходится из-за ошибки двоичной загрузки. Где мне искать подопытные? Любые намеки приветствуются.

def fun2optim(theta):##  Funtion to optimize with the initial guess of paramameter values theta
    model = load_fmu("MOdel_0IV_0curves.fmu")## LOAD THE FMU
    res = model.simulate(input=foo(theta),final_time=1)
    results_VV=np.array([]) ###SAVE THE OUTPUT IN ARRAY
        for i in range(200,400):
        out=(res[output_IV[i]])
        results=out[0::5] #Dymola FMU has 5 same IV curve points
        results_VV=np.append(results_VV,results)
    return(results_VV)

def RMSE (theta): ## results_V are the ideal values
    tt=sum(np.sqrt((fun2optim(theta)-results_V)**2).mean())
    return(tt)

from scipy import optimize
res11=optimize.minimize(RMSE,thetaInit,method='nelder-mead', options={'xtol':   1e-4, 'disp': True})

После 50-60 итераций я получил ошибку:

FMUException: Error loading the binary. Could not load the DLL: A dynamic link library (DLL) initialization routine failed.

1 ответ

Решение

Я уже сталкивался с подобными проблемами с FMU Dymola, и я думаю, что что-то загружено неправильно, что в итоге приводит к проблеме.

Я бы предложил изменить ваш код на:

model = load_fmu("MOdel_0IV_0curves.fmu")## LOAD THE FMU
def fun2optim(theta):##  Funtion to optimize with the initial guess of paramameter values theta
    global model
    model.reset()
    res = model.simulate(input=foo(theta),final_time=1)
    results_VV=np.array([]) ###SAVE THE OUTPUT IN ARRAY
    for i in range(200,400):
       out=(res[output_IV[i]])
       results=out[0::5] #Dymola FMU has 5 same IV curve points
       results_VV=np.append(results_VV,results)
    return(results_VV)

Таким образом, вы не перезагружаете FMU каждый раз (вы просто сбрасываете его), что также приведет к повышению производительности.

Другие вопросы по тегам