Как увеличить число в заданном диапазоне, пока оно не даст конкретного ответа? - PullRequest
0 голосов
/ 16 апреля 2019

Я написал код rungekutta, и существует определенный диапазон x, который должен рассчитываться до него.Проблема в том, что проф.хочет код, который продолжает добавлять самостоятельно, пока не достигнет требуемого ответа.

Я пытался использовать функцию 'if', но она работает только один раз и не более (таким образом, даже создавая несоответствие длины массива.

Код:

h=0.5;% step size
z=0.5;
x = 0:h:z;% the range of x
y = zeros(1,length(x)); 
y(1) = 50;% initial condition
F_xy = @(t,x) (37.5-3.5*x);%function



for i=1:(length(x)-1)% calculation loop
    k_1 = F_xy(x(i),y(i));
    k_2 = F_xy(x(i)+h,y(i)+h*k_1);

    y(i+1) = y(i) + (h/2)*(k_1+k_2);% main equation
    if y(i+1)>11
        x=0:h:z+1;

    end

end



disp (y(i+1))

Ошибка длины массива (показывает, что если функция работает только один раз)

   41.4063

 Error using plot
Vectors must be the same length.

Error in code6rungekutta2ndorder (line 30)
plot(x,y), grid on

, то она должна увеличиваться на +1 в переменной 'z', пока ответ y (i + 1) не станет меньше 11. (правильное значение z должно быть 9,5)

1 Ответ

1 голос
/ 16 апреля 2019

Как подсказал @medicine_man, вам нужен цикл while:

h=0.5;% step size
z=0.5;
x = 0;
y = 50;% initial condition
F_xy = @(t,x) (37.5-3.5*x);%function


m = 0;
while y(m+1) > 11
    m = m+1;
    x = x+h;
    k_1 = F_xy(x,y(m));
    k_2 = F_xy(x+h,y(m)+h*k_1);

    y(m+1) = y(m) + (h/2)*(k_1+k_2);% main equation

end

figure;
plot(0:h:x, y);

Ваше условие завершения, которое является y(m+1) > 11, проверяется в начале каждой итерации цикла while. В цикле вы можете увеличить значение x и обновить массив y. Цикл выполняется до тех пор, пока не будет выполнено условие завершения.

Результат вышеприведенного кода:

enter image description here

...