Проблема с объемом вычислений.

Форум пользователей пакета Maple

Модератор: Admin

EvL
Сообщения: 13
Зарегистрирован: Сб ноя 17, 2012 8:44 pm

Проблема с объемом вычислений.

Сообщение EvL » Чт янв 10, 2013 4:36 pm

Здравствуйте,
столкнулся со следующей проблемой:
[Length of output exceeds limit of 1000000]
слишком много членов в выражении, но без них мне не обойтись. В этом выражении, как один из множителей, присутствует матрица обратная матрице параметров K(симметрическая) размером 6х6 (для представления о каких членах выражения идет речь).
Есть ли способ посчитать все это? Время не работы не имеет значения.
Спасибо за внимание.
С уважением, Евгений.

Markiyan Hirnyk
Сообщения: 1343
Зарегистрирован: Вс дек 04, 2011 11:07 pm

Ссылка.

Сообщение Markiyan Hirnyk » Пт янв 11, 2013 12:46 am

EvL писал(а):Здравствуйте,
столкнулся со следующей проблемой:
[Length of output exceeds limit of 1000000]
слишком много членов в выражении, но без них мне не обойтись. В этом выражении, как один из множителей, присутствует матрица обратная матрице параметров K(симметрическая) размером 6х6 (для представления о каких членах выражения идет речь).
Есть ли способ посчитать все это? Время не работы не имеет значения.
Спасибо за внимание.
С уважением, Евгений.

Посмотрите http://forum.exponenta.ru/viewtopic.php?t=12501

Kitonum
Сообщения: 2079
Зарегистрирован: Ср дек 31, 2008 1:55 pm
Откуда: г. Пенза

Re: Проблема с объемом вычислений.

Сообщение Kitonum » Пт янв 11, 2013 1:21 am

EvL писал(а):Здравствуйте,
столкнулся со следующей проблемой:
[Length of output exceeds limit of 1000000]
слишком много членов в выражении, но без них мне не обойтись. Есть ли способ посчитать все это? Время не работы не имеет значения.
Спасибо за внимание.
С уважением, Евгений.

Приведите целиком свой код!

EvL
Сообщения: 13
Зарегистрирован: Сб ноя 17, 2012 8:44 pm

Re: Проблема с объемом вычислений.

Сообщение EvL » Пт янв 11, 2013 1:42 am

[/quote]
Приведите целиком свой код![/quote]
Весь код приводить,думаю, не стоит (программа выводит обыкновенные дифференциальные уравнения для исследования режимов в стохастических дифференциальных системах, чтобы их вывести нужно проделать огромное количество преобразований и вычислений, которые я автоматизировал).
Вот ключевая часть:
restart; with(ArrayTools); with(linalg); with(LinearAlgebra)
p := 6; K := Matrix(p, symbol = k, shape = symmetric); M := Vector(p, symbol = m); X := Vector(p, symbol = x); a := Vector([(1/2)*X[2]*X[3]-epsilon[1]*X[1], -(1/2)*X[1]*X[3]+(1/2)*omega*X[6]-epsilon[2]*X[2], -omega*X[5]-epsilon[3]*X[3], X[3]*X[5]-X[2]*X[6], X[1]*X[6]-X[3]*X[4], X[2]*X[4]-X[1]*X[5]]); sigma := Matrix([[nu[1], 0, 0, 0, 0, 0], [0, nu[2], 0, 0, 0, 0], [0, 0, nu[3], 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]);

...

в одной процедуре требуется проделать много преобразований с этим выражением:

I1 := expand(2*Multiply(Multiply(Transpose(X-M), 1/K), a)+Trace(Multiply(1/K, sigma)))


вот с этим и проблема.

Размерность вектора состояния всего 6, а уже трудности.
Поэтому я хотел бы узнать, есть ли способы работы с такими большими выражениями.
С уважением, Евгений.

Selin
Сообщения: 43
Зарегистрирован: Чт апр 14, 2011 11:14 am

Сообщение Selin » Пт янв 11, 2013 11:25 am

Есть, если вместо векторов использовать массивы (array), векторы имеют ограничения по длине.

Kitonum
Сообщения: 2079
Зарегистрирован: Ср дек 31, 2008 1:55 pm
Откуда: г. Пенза

Re: Проблема с объемом вычислений.

Сообщение Kitonum » Пт янв 11, 2013 1:01 pm

EvL писал(а):
Весь код приводить,думаю, не стоит (программа выводит обыкновенные дифференциальные уравнения для исследования режимов в стохастических дифференциальных системах, чтобы их вывести нужно проделать огромное количество преобразований и вычислений, которые я автоматизировал).
Вот ключевая часть:
restart; with(ArrayTools); with(linalg); with(LinearAlgebra)
p := 6; K := Matrix(p, symbol = k, shape = symmetric); M := Vector(p, symbol = m); X := Vector(p, symbol = x); a := Vector([(1/2)*X[2]*X[3]-epsilon[1]*X[1], -(1/2)*X[1]*X[3]+(1/2)*omega*X[6]-epsilon[2]*X[2], -omega*X[5]-epsilon[3]*X[3], X[3]*X[5]-X[2]*X[6], X[1]*X[6]-X[3]*X[4], X[2]*X[4]-X[1]*X[5]]); sigma := Matrix([[nu[1], 0, 0, 0, 0, 0], [0, nu[2], 0, 0, 0, 0], [0, 0, nu[3], 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]);

...

в одной процедуре требуется проделать много преобразований с этим выражением:

I1 := expand(2*Multiply(Multiply(Transpose(X-M), 1/K), a)+Trace(Multiply(1/K, sigma)))


вот с этим и проблема.

Размерность вектора состояния всего 6, а уже трудности.
Поэтому я хотел бы узнать, есть ли способы работы с такими большими выражениями.
С уважением, Евгений.


Очень трудно дать какой-либо конкретный совет по обрывкам кода, не зная исходной постановки задачи. Если совет г-на Selin'a не поможет, то могу только сказать следующее:

1) При работе с символьными даже не очень большими матрицами очень часто возникают проблемы. Например, при попытке сосчитать значение определителя матрицы 10 порядка получаем

LinearAlgebra[Determinant](Matrix(10, symbol = k));
Error, (in LinearAlgebra:-Determinant) object too large

Это и понятно, т.к. количество слагаемых в разложении этого определителя равно 10! , что больше 3 миллионов.
Может быть при решении Вашей задачи можно какие-то символьные вычисления заменить числовыми.

2) Если без символьных вычислений обойтись невозможно, подумайте о том нельзя ли их как-то упростить. Например при работе с большими матрицами выбрать базис, в котором эта матрица имеет наиболее простой вид. Например, хорошо известно, что все собственные значения симметрической матрицы являются действительными и в базисе из собственных векторов она является диагональной.

EvL
Сообщения: 13
Зарегистрирован: Сб ноя 17, 2012 8:44 pm

Re: Проблема с объемом вычислений.

Сообщение EvL » Пт янв 11, 2013 11:22 pm

Kitonum писал(а):
EvL писал(а):
Весь код приводить,думаю, не стоит (программа выводит обыкновенные дифференциальные уравнения для исследования режимов в стохастических дифференциальных системах, чтобы их вывести нужно проделать огромное количество преобразований и вычислений, которые я автоматизировал).
Вот ключевая часть:
restart; with(ArrayTools); with(linalg); with(LinearAlgebra)
p := 6; K := Matrix(p, symbol = k, shape = symmetric); M := Vector(p, symbol = m); X := Vector(p, symbol = x); a := Vector([(1/2)*X[2]*X[3]-epsilon[1]*X[1], -(1/2)*X[1]*X[3]+(1/2)*omega*X[6]-epsilon[2]*X[2], -omega*X[5]-epsilon[3]*X[3], X[3]*X[5]-X[2]*X[6], X[1]*X[6]-X[3]*X[4], X[2]*X[4]-X[1]*X[5]]); sigma := Matrix([[nu[1], 0, 0, 0, 0, 0], [0, nu[2], 0, 0, 0, 0], [0, 0, nu[3], 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]);

...

в одной процедуре требуется проделать много преобразований с этим выражением:

I1 := expand(2*Multiply(Multiply(Transpose(X-M), 1/K), a)+Trace(Multiply(1/K, sigma)))


вот с этим и проблема.

Размерность вектора состояния всего 6, а уже трудности.
Поэтому я хотел бы узнать, есть ли способы работы с такими большими выражениями.
С уважением, Евгений.


Очень трудно дать какой-либо конкретный совет по обрывкам кода, не зная исходной постановки задачи. Если совет г-на Selin'a не поможет, то могу только сказать следующее:

1) При работе с символьными даже не очень большими матрицами очень часто возникают проблемы. Например, при попытке сосчитать значение определителя матрицы 10 порядка получаем

LinearAlgebra[Determinant](Matrix(10, symbol = k));
Error, (in LinearAlgebra:-Determinant) object too large

Это и понятно, т.к. количество слагаемых в разложении этого определителя равно 10! , что больше 3 миллионов.
Может быть при решении Вашей задачи можно какие-то символьные вычисления заменить числовыми.

2) Если без символьных вычислений обойтись невозможно, подумайте о том нельзя ли их как-то упростить. Например при работе с большими матрицами выбрать базис, в котором эта матрица имеет наиболее простой вид. Например, хорошо известно, что все собственные значения симметрической матрицы являются действительными и в базисе из собственных векторов она является диагональной.


В остальном коде проблем, я думаю, не возникнет. Основная проблема именно здесь:

I1 := expand(2*Multiply(Multiply(Transpose(X-M), 1/K), a)+Trace(Multiply(1/K, sigma)))

Конвертировал в array, та же ошибка.

1) У меня была надежда на то, что в Maple это как-то можно сделать(выгружать данные и тп.), время не важно, лишь бы не считать вручную (для меня, с моей невнимательностью в вычислениях, это не реально).

2)Матрица K - ковариационная матрица сечений случайного процесса и в силу применяемых методов ее элементы считаются функциями времени, думаю, сильного упрощения здесь не будет(даже если бы от такой замены не менялись уравнения).

С уважением, Евгений.

EvL
Сообщения: 13
Зарегистрирован: Сб ноя 17, 2012 8:44 pm

Сообщение EvL » Пт янв 11, 2013 11:24 pm

Selin писал(а):Есть, если вместо векторов использовать массивы (array), векторы имеют ограничения по длине.

Спасибо за совет, я конвертировал все в array, но та же ошибка.
С уважением, Евгений.

Selin
Сообщения: 43
Зарегистрирован: Чт апр 14, 2011 11:14 am

Сообщение Selin » Сб янв 12, 2013 11:40 am

ледует изначально все определять массивами, а не конвертировать.

EvL
Сообщения: 13
Зарегистрирован: Сб ноя 17, 2012 8:44 pm

Сообщение EvL » Вс янв 13, 2013 1:23 am

Selin писал(а):ледует изначально все определять массивами, а не конвертировать.


> restart; with(ArrayTools); with(linalg); with(LinearAlgebra); K := array([[k[1, 1], k[1, 2], k[1, 3], k[1, 4], k[1, 5], k[1, 6]], [k[1, 2], k[2, 2], k[2, 3], k[2, 4], k[2, 5], k[2, 6]], [k[1, 3], k[2, 3], k[3, 3], k[3, 4], k[3, 5], k[3, 6]], [k[1, 4], k[2, 4], k[3, 4], k[4, 4], k[4, 5], k[4, 6]], [k[1, 5], k[2, 5], k[3, 5], k[4, 5], k[5, 5], k[5, 6]], [k[1, 6], k[2, 6], k[3, 6], k[4, 6], k[5, 6], k[6, 6]]]); M := array([m[1], m[2], m[3], m[4], m[5], m[6]]); X := array([x[1], x[2], x[3], x[4], x[5], x[6]]); a := array([(1/2)*X[2]*X[3]-epsilon[1]*X[1], -(1/2)*X[1]*X[3]+(1/2)*omega*X[6]-epsilon[2]*X[2], -omega*X[5]-epsilon[3]*X[3], X[3]*X[5]-X[2]*X[6], X[1]*X[6]-X[3]*X[4], X[2]*X[4]-X[1]*X[5]]); sigma := array([[nu[1], 0, 0, 0, 0, 0], [0, nu[2], 0, 0, 0, 0], [0, 0, nu[3], 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]); e := expand(2*multiply(multiply(X-M, inverse(K)), a)+trace(multiply(inverse(K), sigma)));
print(`output redirected...`);

[Length of output exceeds limit of 1000000]

Selin
Сообщения: 43
Зарегистрирован: Чт апр 14, 2011 11:14 am

Сообщение Selin » Вс янв 13, 2013 10:43 am

Как видим, диагностика более конкретна. Попробуйте результат писать в файл, скажем, по writeto.

EvL
Сообщения: 13
Зарегистрирован: Сб ноя 17, 2012 8:44 pm

Сообщение EvL » Пн янв 14, 2013 9:36 pm

Selin писал(а):Как видим, диагностика более конкретна. Попробуйте результат писать в файл, скажем, по writeto.


currentdir();
writeto("ex.txt");
expand(2*Multiply(Multiply(Transpose(X-M), 1/K), a)+Trace(Multiply(1/K, sigma)));
writeto(terminal);

Не помогает. Зависал несколько раз на полчаса, в конце - "программа не отвечает".
С уважением, Евгений.

Kitonum
Сообщения: 2079
Зарегистрирован: Ср дек 31, 2008 1:55 pm
Откуда: г. Пенза

Сообщение Kitonum » Пн янв 14, 2013 11:42 pm

EvL писал(а):
Selin писал(а):Как видим, диагностика более конкретна. Попробуйте результат писать в файл, скажем, по writeto.


currentdir();
writeto("ex.txt");
expand(2*Multiply(Multiply(Transpose(X-M), 1/K), a)+Trace(Multiply(1/K, sigma)));
writeto(terminal);

Не помогает. Зависал несколько раз на полчаса, в конце - "программа не отвечает".
С уважением, Евгений.

Евгений, а Вы точно уверены, что без этих символьных преобразований Вам никак не обойтись? Предположим, что Вам удалось получить некоторый объект с числом операндов более 1000000. И что Вы дальше собираетесь с этим делать? Если цель - заполнить половину диссертации листингом этих Ваших вычислений, то это одно. А если по существу решаемой задачи, то совсем другое. Рискну предположить, что в конце концов вместо параметров Вы будете подставлять какие-то числа. А почему нельзя всё это сделать вначале и все вычисления проводить не с символьными, а с числовыми объектами. Тогда все проблемы отпадут сами собой!
Или такой вариант: все свои матрично-векторные преобразования проводите символьно, но не раскрываете полученные выражения поэлементно, а записываете их в так называемой инертной форме. Тогда результат останется символьным, но будет не таким громоздким, а провести нужные числовые вычисления Вы сможете в любой подходящий момент.

EvL
Сообщения: 13
Зарегистрирован: Сб ноя 17, 2012 8:44 pm

Сообщение EvL » Вт янв 15, 2013 10:40 am

Kitonum писал(а):
EvL писал(а):
Selin писал(а):Как видим, диагностика более конкретна. Попробуйте результат писать в файл, скажем, по writeto.


currentdir();
writeto("ex.txt");
expand(2*Multiply(Multiply(Transpose(X-M), 1/K), a)+Trace(Multiply(1/K, sigma)));
writeto(terminal);

Не помогает. Зависал несколько раз на полчаса, в конце - "программа не отвечает".
С уважением, Евгений.

Евгений, а Вы точно уверены, что без этих символьных преобразований Вам никак не обойтись? Предположим, что Вам удалось получить некоторый объект с числом операндов более 1000000. И что Вы дальше собираетесь с этим делать? Если цель - заполнить половину диссертации листингом этих Ваших вычислений, то это одно. А если по существу решаемой задачи, то совсем другое. Рискну предположить, что в конце концов вместо параметров Вы будете подставлять какие-то числа. А почему нельзя всё это сделать вначале и все вычисления проводить не с символьными, а с числовыми объектами. Тогда все проблемы отпадут сами собой!
Или такой вариант: все свои матрично-векторные преобразования проводите символьно, но не раскрываете полученные выражения поэлементно, а записываете их в так называемой инертной форме. Тогда результат останется символьным, но будет не таким громоздким, а провести нужные числовые вычисления Вы сможете в любой подходящий момент.


Дело в том, что это программа, по-идее, должна выводить систему обыкновенных дифференциальных уравнений для этих параметров, затем я исследую поведение процесса, смотря на решение этой системы, ну это уже в matlab.
С уважением, Евгений.

Kitonum
Сообщения: 2079
Зарегистрирован: Ср дек 31, 2008 1:55 pm
Откуда: г. Пенза

Сообщение Kitonum » Вт янв 15, 2013 12:33 pm

EvL писал(а):...это программа, по-идее, должна выводить систему обыкновенных дифференциальных уравнений для этих параметров...

Возможно, Вам будет полезнее сначала разобраться получше в самой идее, чем попусту гонять свой комп.