2017-01-22 4 views
0

У меня есть уравнение на форме A^n * b = e = c, где A - матрица, а b & c - векторы столбцов.Уравнение, содержащее матричную мощность

n - фиксированное число для моей модели, определяемое константой. Скорее всего, он будет в сотнях и будет изменен для разных решений.

A - матрица переменных, b & c - константы.

Как я могу сформулировать A^n * b = e = c в gams?

Необязательно: модель, которая ведет меня к этому, состоит в том, что у меня есть граф с матрицей связности con (x, x2), обозначающий связь между x и x2, когда x и x2 связаны. Я хотел бы рассчитать связь между двумя произвольными узлами, связь между двумя узлами x и x2 является суммой связности для всех путей от x до x2. соединение для пути является продуктом всех соединений по пути. Есть ли более разумный способ сформулировать это ограничение, так что мне не нужно делать экспоненцию матрицы?

A не является симметричным или обратимым, но является положительным Полуконечным.

ответ

0

Сначала необходимо определить свои данные в терминах наборов и параметров. Перейдите по этой ссылке для получения дополнительной информации о структуре данных в ГАМС: http://www.gams.com/latest/docs/userguides/userguide/_u_g__data_entry.html

начать с определения набора и параметры вашей проблемы, предполагая, у вас есть 100 вершин, вы можете объявить x как это, например:

Set x /x1*x100/; 
alias(x,x2); 

Поскольку вам нужно будет использовать один и тот же набор дважды в своей матрице, вы должны определить alias, так что x2 интерпретируется GAMS так же, как x в вашей модели.

Затем объявить n и b в качестве параметров, вы можете сделать это следующим образом:

Parameter 
n /200/ 
c /100/; 
Parameter b(x) 
/
x1 3 
x2 43 
... 
x100 23 
/; 

Обратите внимание, что parameters и variables с более чем одним значением (т.е. векторы или матрицы) должны быть определены над ранее set в GAMS. Вот почему b определяется по набору x, думаю, x как индексы ваших векторов/матриц.

Декларация A будет иметь вид:

Variable A(x,x2); 

Теперь вы можете определить уравнение с помощью этих наборов параметров и переменных:

eq(x,x2) .. power(A(x,x2),n) * B(x2) =e= c; 

Конечно, вам все равно нужно выбрать подходящий решатель (NLP) и определить целевую функцию, но именно так вы будете моделировать требуемое уравнение и переменные для него.

+0

Не обладает ли степенью просто возведения в степень aka A_ (x, x2)^n вместо фактического выполнения умножения матрицы на всех A, что является совсем другим результатом? – Bomaz

+0

Да, это абсолютно верно. GAMS действительно не идеальна для выполнения матричных умножений AFAIK, но есть несколько утилит, которые могут помочь, например, инверсия матрицы и собственные векторы. Я думал, что упомянул бы их, если вы их не увидели. https: //www.gams.com/latest/docs/userguides/mccarl/matrix_utilities.htm Я уверен, что вы спрашиваете, возможно, но я понятия не имею, как это сделать. –

+0

«Я хотел бы рассчитать связь между двумя произвольными узлами, связь между двумя узлами x-x2 является суммой связности для всех путей от x до x2. Связность для пути является продуктом всех соединений по пути Есть ли более разумный способ сформулировать это ограничение, так что мне не нужно делать экспоненцию матрицы? " Похоже, что это может быть выполнено довольно легко с комбинацией циклов и сумм. –