Как исправить «Определения функций не разрешены в командной строке или в сценариях» - PullRequest
4 голосов
/ 11 мая 2011

Я хочу написать код для этого уравнения: T2(i)=T1(i)+2*[T1(i-1)+T1(i+1)]

syms T1  T2
function [T2] = stat(T1)

for   i=1:3
   T2(i)=T1(i)*2+[T1(i-1,)+T1(i+1,)]*2
end

Я хочу, чтобы код выдал T2(111)=T1(111)+2*[T1(011)+T(211)], и цикл продолжился.но Matlab выдает эту ошибку

«Определения функций не разрешены в приглашении или в сценариях»

Как решить эту проблему?1014 *

Ответы [ 4 ]

4 голосов
/ 11 мая 2011

Matlab ожидает, что функции будут в их собственном файле.Скопируйте приведенный выше код в файл stat.m, и он должен работать.

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

2 голосов
/ 12 мая 2011

Как указал Quantum7 , вы определили функцию в том же скрипте, который выдаст вам ошибку.Независимо от того, находится функция в другом файле или нет, то, что вы там написали, не является допустимой операцией с символическими переменными.Если вы просто закомментируете вторую строку и запустите ее, вы получите следующую ошибку:

???Ошибка при использовании ==> sym.sym> checkindex в 2697

Индекс должен быть положительным целым или логическим.

, потому что i-1 равен нулю для первого цикла, иMATLAB начинает считать с 1. Если вы попробуете for i=2:3, вы получите эту ошибку,

???Ошибка при использовании ==> mupadmex

Ошибка в команде MuPAD: индекс превышает размеры матрицы.

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

Из того, что вы написали, кажется, что у вас есть массив T1, а T2 составлен из T1 в соответствии с соотношением: T2(i)=T1(i)+2*[T1(i-1)+T1(i+1)].Я думаю, что лучший способ сделать то, что вы пытаетесь, это использовать анонимные функции.

Я немного изменю индексирование, чтобы учесть тот факт, что в первом и последнем элементе вы получите ошибку, поскольку индекс превысит границы T1.Тем не менее, ответ тот же.

dummyT1=[0;T1(:);0];
f=@(i)(dummyT1(i+1)+2*(dummyT1(i)+dummyT1(i+2)));
T2=f(1:3)

Если вы не хотите добавлять нули, а вместо этого сделать его круглым (т. Е. T1(0)=T1(3)), то вы можете использовать тот же код, легко модифицируяопределение f.

0 голосов
/ 03 декабря 2017

Функции в скриптах разрешены с версии R2016 или новее

https://www.mathworks.com/help/matlab/matlab_prog/local-functions-in-scripts.html

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

0 голосов
/ 11 ноября 2013

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

...