определить тензор 4-го ранга в Maple - PullRequest
0 голосов
/ 12 мая 2018

Я новичок в Клене.Не могли бы вы помочь мне преобразовать следующий короткий код из Matlab в Maple:

I=0.0;
for i1=1:3
I(i1,i1,i1,i1)=1.0;
end

Я пытался написать его так:

unprotect(I);
 I:=0.0;
for i1 from 1 to 3 do
    for i2 from 1 to 3 do
        for i3 from 1 to 3 do
            for i4 from 1 to 3 do
     if i1=i2 and i2=i3 and i3=i4 then I[i1,i2,i3,i4]:=1.0;
     else I[i1,i2,i3,i4]:=0.0;
     end if;
             od;
         od;
     od;
 od;

Но выдает следующую ошибку:

Error, illegal use of an object as a name
Error, illegal use of an object as a name

Может кто-нибудь сказать мне, что не так?

Спасибо,

1 Ответ

0 голосов
/ 14 мая 2018

Было бы проще, если бы вы не настаивали на использовании имени I, которое в Maple имеет особое значение sqrt -1.

restart;

interface(imaginaryunit=j):
local I:=Array((1..3)$4,datatype=float[8]);
for i1 from 1 to 3 do
  I[i1,i1,i1,i1]:=1.0;
end do:

Выше приведено I в виде 4-мерного массива, где каждое измерение имеет ширину из трех элементов. И все три "длинных диагональных" элемента инициализируются до 1,0. И массив может содержать аппаратные поплавки двойной точности. И все остальные элементы по умолчанию 0.0.

Это то, что вы пытались сделать?

Если вы не настаиваете на том, чтобы называть его специальным именем I, тогда все будет проще. Например,

restart;

II:=Array((1..3)$4,datatype=float[8]):
for i1 from 1 to 3 do
  II[i1,i1,i1,i1]:=1.0;
end do:

Вы не можете должным образом переопределить / отключить специальное значение I, просто сняв его с защиты. (И даже если бы вы могли, снять защиту и переопределить I - неосуществимая идея, поскольку значительная часть команд Maple больше не будет правильно вычисляться в данном сеансе.)

Последние версии Maple позволяют создавать так называемый «локальный» экземпляр этого имени верхнего уровня, который можно использовать отдельно от обычного глобального имени I. Если вы настаиваете на этом маршруте, и если ваша версия Maple достаточно свежая, чтобы поддержать его, то вы, вероятно, также захотите изменить настройка интерфейса для воображаемой единицы (sqrt of -1), чтобы все не было слишком запутанным. Вот почему я показал это в первом примере выше.

Но я действительно думаю, что вам было бы проще, если бы вы просто использовали другое имя, например II или что у вас.

Вам не нужно накладывать ограничение datatype=float[8] на массив. Но если ваш последующий код имитирует некоторый (изначально) код Matlab, то, возможно, плавающие объекты - это все, что будет назначено в массив. И некоторые операции с массивами могут быть намного быстрее, с этим. Посмотрите, как это происходит.

...