В начале вы устанавливаете M = 5000;
. В следующей строке, вы создаете анонимную функцию также называют M
:
[email protected](t) M*exp(-4.5*t);
Теперь ваша начальная M = 5000
переменная была перезаписана и замещена функцией:
M(t) = 5000 * exp(-4.5*t); %// Note that the first M is used to get 5000
После этого вы делаете F = -4.5*M(t)
. Я не знаю, что значение t
здесь, но вы даете F
значение -4.5 * 5000 * exp(-4.5*t)
, для некоторого значения t
. Вы являетесь не, создавая функцию F
.
В первой итерации цикла, M=M(t)+h.*F;
не интерпретируются как:
M = 5000 * exp(-4.5*0) + 0.1*F %// Where F has some value determined by previous
%// the function above and the previous value of t
%// -4.5*0 is because t = 0
M
теперь уже не является функция, но одно значение скаляра. Следующая итерация t = 0.1
. Когда вы выполните: M=M(t)+h.*F;
, теперь он интерпретирует как первый, так и второй M
как переменную, а не функцию. t
поэтому используется как индекс, а не является входным параметром функции M
(так как вы его перезаписали).
Когда вы пишете M(t)
, вы пытаетесь получить доступ к 0,1-му элементу матрицы 1x1 (скаляр) M
, что, очевидно, невозможно.
Дополнительные примечания:
Наружный пока петля не имеет цели, как она стоит сейчас, поскольку i
не сбрасывается после внутреннего цикла. Когда вы закончите первую итерацию внешнего цикла, i
уже >n
, поэтому он больше не войдет во внутренний цикл.
Не следует смешивать имена переменных и функций (как вы делаете с M
. Используйте разные имена, всегда. Если у вас есть очень уважительная причина не делать этого.
data_out=[t,M];
- растущий вектор внутри цикла. Это считается очень плохой практикой, анс очень медленный. Лучше предварительно выделить память для вектора, например, используя data_out = zeros(k,1)
, и вставить новые значения с использованием индексов, data_out(ii) = M
.
Не рекомендуется использовать i
и j
как имена переменных в MATLAB, так как они также представляют собой мнимое устройство sqrt(-1)
. Это может вызвать некоторые странные ошибки, если вы не обращаете на это внимания.
Вы почти наверняка можете делать то, что вы пытаетесь сделать без циклов. Однако функция, которую вы написали, не работает, и она не слишком хорошо объясняет, что вы пытаетесь сделать, поэтому трудно дать совет относительно того, как вы можете получить то, что хотите (но я дам ему попробовать). Я пропускаю dlmwrite
-part, потому что я действительно не понимаю, что вы хотите вывести.
M = 5000;
t0 = 0;
tmax = 20;
h = 0.1; %// I prefer leading zeros in decimal numbers
t = t0: h: tmax;
data_out = M .* exp(-4.5 * t);
Вы удалите сообщение об ошибке, выполнив это, но я не думаю, что вы были бы ближе к ответу, так как в этом вопросе так много других вещей. –