2015-06-01 5 views
0
k = 0.019; 
Pstar = 100; 
H = 33; 
h = 0.1; 
X = 36; 
N = round(X/h); 
t = zeros(1,N+1); 
P = zeros(1,N+1); 
P(1) = 84; 
t(1) = 0; 
yHeun = zeros(1,N+1); 
yHeun(1)=84; 
a = 1; b = 100; 
while b-a >0.5 
    c = (a+b)/2; 
    for n = 1:N 
     t(n+1) = t(n) + h; 
     Inside = nthroot(sin(2*pi*t/12),15); 
     Harvest = c*0.5*(Inside+1); 
     P(n+1) = P(n) + h*(k*P(n)*(Pstar-P(n))-Harvest(n)); 
     if P < 0 
      P = 0; 
     end 
     yHeun(n+1) = yHeun(n) + h*0.5*((k*P(n)*(Pstar-P(n))-Harvest(n))+(k*P(n+1)*(Pstar-P(n+1))-Harvest(n+1))); 
    end 
    if sign(yHeun(c)) == sign(yHeun(a)) 
     c = a; 
    else 
     c = b; 
    end 
end 
disp(['The root is between ' num2str(a) ' and ' num2str(b) '.']) 

Это код, который я пытаюсь запустить, и я знаю, что это, вероятно, отстой, но им ужасно кодирование и каждый раз, когда я пытаюсь запустить код, он говорит:индекс должен быть положительным целым или логическим?

Пытался доступ yHeun (50,5); индекс должен быть положительным целым числом или логическим.

Ошибка в Matlab3Q4 (строка 30) если знак (yHeun (с)) == знак (yHeun (а))

Я не имею ни малейшего представления, как сделать yHeun (с или или что-то еще) возвращать все, что было бы целым числом. Я не думаю, что я сделал while + for loop правильно.

Вопрос: «Начните с высшей границы H, равной 100 (высокое значение приводит к совокупности 0 после 36 месяцев), а нижняя граница равна 1. Поместите решатель из задачи № 3 выше в в середине цикла while и делите пополам верхнюю и нижнюю границы H до тех пор, пока разница между верхней и нижней границей не станет меньше 0,5 ".

+0

На каком языке это? Вы должны добавить тег. –

+0

Как стать лучше: http://uk.mathworks.com/help/matlab/debugging-code.html – nkjt

ответ

1

Я думаю, эта линия 30 (с ошибкой) это одна:

if sign(yHeun(c)) == sign(yHeun(a)) 

Здесь я догадываюсьc равно 50.5, в результате c = (a+b)/2 выше (BTW вы можете обнаружить Я правильно догадался, отлаживая - попробуйте добавить disp(c) до строки 30).

Чтобы принудить число быть целым числом, используйте floor:

c = floor((a+b)/2); 

Кажется, вы пытаетесь использовать какой-то алгоритм разделяй и властвуй; этого должно быть достаточно, чтобы остановить, когда b - a равно 1.

Смежные вопросы