Как хранить значения, рассчитанные в цикле - PullRequest
2 голосов
/ 10 октября 2019

Я хочу сохранить значения, рассчитанные в каждом цикле, в массиве.

Q2 = np.array([20, 25, 30, 25, 20, 15, 10, 15, 20, 25, 30, 25, 20])
Q3 = np.array([40, 45, 50, 45, 40, 35, 30, 35, 40, 45, 50, 45, 40])


for i in range(13):   
    m = GEKKO()             # create GEKKO model
    x = m.Var(value=0)      # define new variable, initial value=0
    y = m.Var(value=0)      # define new variable, initial value=1
    z = m.Var(value=0)
    m.Equations([x - y == Q2[i], y + z == Q3[i],
                 K[0]*x**2 + K[1]*y**2 - K[2]*z**2 == 0]) # equations
    m.solve(disp=False)     # solve

    print([x.value, y.value, z.value]) # print solution

Для каждого Q (i) я ожидаю получить: x.value (i), y.value (i), z.value (i)

Теперь он печатает всеответы, но я хочу сохранить в матрице.

Ответы [ 3 ]

0 голосов
/ 10 октября 2019

У вас есть 2 решения, либо вы можете создать класс, содержащий 3 числа, которые будут x, y и z, и создать список этого класса. В общем, у вас будет такая структура:

контейнерный класс: int x int y int z

И затем вы создаете объект этого класса для каждой пары, которую хотите, и затем сохраняете их всписок.

Или вы можете создать 3 списка, один для x, один для y и один для z. В котором на каждой итерации вы сохраняете каждое значение в соответствующем списке. Поскольку у вас будет одинаковый индекс для каждого списка, вам просто нужно иметь индексное значение и проверять в каждом списке заданное значение.

0 голосов
/ 10 октября 2019

Как и в предыдущем ответе, вы также можете сделать это с массивами и списками. Обычно я использую вложенные списки из-за простоты.

Вот пример:

my_list = []
for i in range(3):
    my_list.extend([i,i*2,i*3])
print(my_list)

OUTPUT
[[0, 0, 0], [1, 2, 3], [2, 4, 6]]

0 голосов
/ 10 октября 2019

Если новый pandas dataframe подходит для вас (как я бы сделал, поскольку он облегчает понимание результатов), вы можете создать пустой dataframe перед циклом с помощью:

df = pd.DataFrame(columns=['X', 'Y', 'Z'])

И присвойте ему в конце каждого цикла:

df.loc[len(df)] = (x.value, y.value, z.value)
...