Десериализация в pyomo данных, построенных в Mathematica - PullRequest
0 голосов
/ 30 января 2020

Программа Mathematica возвращает в качестве выходных данных сумму кардинальных синусов. Первый элемент вектора:

-19.9959 Sinc[0.0418879 (0. + t)] Sinc[0.0897598 (-65. + u)]

Переменная сохраняется в текстовом файле; тем не менее, это должно быть прочитано в pyomo как переменная, поэтому StringReplace используется для адаптации этой переменной к грамматике python

savedXPython = 
 Import["savedWindX.txt"] // 
  StringReplace[#, {"[" -> "(", "]" -> ")", 
     "t" -> "m.lammda[i]*180/np.pi", "u" -> "m.phi[i]*180/np.pi"}] &

Затем сохраненныйX Python был сохранен в другой текстовый файл. Однако при работе с pyomo появилась ошибка; Я спросил здесь , и ответ состоял в том, чтобы сохранить результат в файле json вместо текста.

Export["savedWindXPython.txt", savedXPython];
Export["savedWindXPythonJ.json", savedXPython, "ExpressionJSON"];

Теперь, в части pyomo, текстовый файл был первоначально прочитан как

g = open("savedWindXPython.txt","r")
b=f.readline()
g.close

позже, после этой темы , json имеет было прочитано как

f = open("savedWindXPythonJ.json","r")
a=f.readline()
f.close

И затем переменная внутри кода pyomo определяется как

def Wind_lammda_definition(model, i):
    return m.Wind_lammda[i] == a
m.Wind_lammda_const = Constraint(m.N, rule = Wind_lammda_definition)

в случае файла json или def Wind_lammda_definition (model, i) : return m.Wind_lammda [i] == b m.Wind_lammda_const = Constraint (mN, rule = Wind_lammda_definition

в случае исходного текстового файла

Код, однако, не работает. AttributeError: 'str' object has no attribute 'is_relational', ошибка, которая помешала мне просто прочитать переменную из текстового файла, также появляется в случае json.

Кажется, что использование формата json не помогло. Может кто-нибудь сказать мне если реализация json была сделана неправильно?

1 Ответ

0 голосов
/ 03 февраля 2020

При чтении строки из вашего файла Pyhton всегда будет возвращать строку. Если 1 является единственным содержимым в вашей строке, возвращаемое значение будет равно "1", а не 1. Это можно решить с помощью a = float(a), так как вы хотите использовать значение числительного c в своем ограничении. Это просто преобразует вашу строку a в число с плавающей точкой.

...