2014-11-28 4 views
0

У меня возникают проблемы с кодовым кодом, связанным с распадом. Ошибка «Индексы индексов должны быть либо вещественными целыми числами, либо логическими» продолжает происходить независимо от того, сколько раз я пытаюсь исправить строку кода: M = M (t) + h. * FИндексы индексов должны быть либо положительными целыми числами, либо логическими ошибками в программе Matlab-распада

Вот полный кода, чтобы было легче решить проблему:

M=10000; 

[email protected](t) M*exp(-4.5*t); 

F=-4.5*M(t); 

h=.1; 

t(1)=0; 

tmax=20; 

n=(tmax-t(1))/h; 

i=1; 


while h<=.5 
    while i<=n 

    t=t+h; 

    M=M(t)+h.*F; 

    data_out=[t,M]; 

    dlmwrite('single_decay_euler_h.txt',data_out,'delimiter','\t','-append'); 

    i=i+1; 

    end 
h=h+.1; 
end 

Спасибо за любую помощь.

ответ

0

Проблема вызвана M(t) в вашем коде, потому что t не является целым числом или логическим (т = 1,1.1,1.2, ...)

Вы должны изменить код, чтобы передать целое как индекс. Либо умножьте t на 10, либо не используйте матрицу M, если она вам не нужна.

+0

Вы удалите сообщение об ошибке, выполнив это, но я не думаю, что вы были бы ближе к ответу, так как в этом вопросе так много других вещей. –

1

В начале вы устанавливаете 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);