Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программное обеспечение > создать символическую матрицу в Matlab


Автор: ksili 25.7.2008, 17:08
Что-то не получается в скрипте Matlab 6.5 программно заполнить матрицу символическими переменными (выражениями).
Вот так работает:
Код

a0 = sym('a0');
a1 = sym('a1');

A = [
[1  0   0   0],
[0  1   a1 0],
[0  0  a0+a1 0],
[0  0  2*a0   a1]
]

А вот так нет:
Код

a0 = sym('a0');
a1 = sym('a1');
a2 = sym('a2');
a3 = sym('a3');

Asym = [a0 a1 a2 a3];

for i = 1:n
    for j = 1:n
        for k = 1:n
            A(i,j) = A(i,j) + Asym(n-k+1)*(j)^k;
        end
    end
end

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

Автор: bilbobagginz 26.7.2008, 16:49
Цитата(ksili @  25.7.2008,  17:08 Найти цитируемый пост)
for i = 1:n
    for j = 1:n
        for k = 1:n

а где n определен ?
какую ошибку получаешь ?

Добавлено через 1 минуту и 42 секунды
Цитата(ksili @  25.7.2008,  17:08 Найти цитируемый пост)
Asym = [a0 a1 a2 a3];

т.е. создан вектор.

Автор: ksili 26.7.2008, 17:19
Цитата(bilbobagginz @  26.7.2008,  20:49 Найти цитируемый пост)
а где n определен ?

да n конечно же определён. я тут привёл только суть неработающего участка
Цитата(bilbobagginz @  26.7.2008,  20:49 Найти цитируемый пост)
Цитата(ksili @  25.7.2008,  17:08 )Asym = [a0 a1 a2 a3];т.е. создан вектор.

да, если вот так явно определить вектор или матрицу, неважно, то вполне работает. Потом над ней даже можно совершать символические действия. Например написать Asym(1) = Asym(2) - Asym(3), и Asym(1) станет равным a1-a2.
Но мне надо много сформировать таких матриц (для разных n), вручную долго и глупо, т.к. матрицы будут становиться все большей размерности. Поэтому решил это сделать примерно как в том тройном цикле. 
Цитата(bilbobagginz @  26.7.2008,  20:49 Найти цитируемый пост)
какую ошибку получаешь ?

На русский я перевёл как "невозможно преобразовать символическое к типу double". На буржуйском примерно так: "Conversion from sym to double impossible" (по памяти)

Автор: bilbobagginz 26.7.2008, 17:33
http://www.google.com/search?&q=matlab+symbolic+math+tutorial
они рекомендуют:
Код

syms а0 а1 а2 а3;

я позже попробовал, но на более новой версии: Version 7.2.0.294 (R2006a):
Код

v=[a0 a1 a2 a3];
g=v(1)*3;

получилось. тогда в цикле попробуй:
Код

A(i,j) = A(i,j) + Asym(n-k+1)*((j)^k);

Автор: ksili 26.7.2008, 17:40
Цитата(bilbobagginz @  26.7.2008,  21:33 Найти цитируемый пост)
http://www.google.com/search?&q=matlab...c+math+tutorial

Гениально!

Автор: bilbobagginz 26.7.2008, 17:45
добавь скобочки, как я предлагаю.
если не работает - возможно код maple, который был включен в матлаб был глючен.
доставай более новую версию matlab, или переходи на maple.

Добавлено через 3 минуты и 39 секунд
Цитата(ksili @  26.7.2008,  17:40 Найти цитируемый пост)
Гениально! 

ты серьёзно или с иронией ?

Добавлено через 5 минут и 53 секунды
Цитата(ksili @  26.7.2008,  17:19 Найти цитируемый пост)
На русский я перевёл как "невозможно преобразовать символическое к типу double"

наверное в данном контексте тип "sym".
т.е. 
Цитата

невозможно преобразовать sym в double

но он еще там должен был написать столбик (т.е. символ с первой позиции по счету), на котором он кирдыкнулся.

Автор: ksili 28.7.2008, 05:58
Цитата(bilbobagginz @  26.7.2008,  21:45 Найти цитируемый пост)
ты серьёзно или с иронией ?

с иронией

Тут решил в отдельном скрипте попробовать решить чисто вот эту задачу формирования символьной матрицы. Долго мучался из-за того, что что бы ни было в файле, ответом был ноль (писал просто ans = 0). Сегодня наконец понял, в чём дело. Файл я сохранил как sym.m, а это видимо делать было нельзя. Переименовал файл - Matlab стал опять его нормально выполнять.
Вот весь скрипт:
Код

syms a0 a1 a2 a3;

Asym = [a0 a1 a2 a3];
n = 2;
% формирование символической матрицы
clear A;
A(6,6) = 0;

for i = 1:n+1
    A(i,i) = 1; 
end

for i = n+2:2*n          % столбцы
    for j = i-n:2*(n+1) % строки
        for k = 1:n+1     % члены многочлена
            A(j,i) = A(j,i) + Asym(n-k+1)*((j-2)^k);  
        end  
    end
end


Ошибка такая:
Цитата

??? Conversion to double from sym is not possible.
On line 16   ==>     A(j,i) = A(j,i) + Asym(n-k+1)*((j-2)^k);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)