Итак, у меня есть школьное задание, в котором мне нужно рассчитать положение группы автомобилей, следующих друг за другом на дороге (иначе говоря, движущихся по линии, поэтому, если Автомобиль 10 [автомобиль, который стоит первым] тормозит, тогда Автомобиль 9 тормозит). и когда Автомобиль 9 тормозит, Автомобиль 8 должен тормозить и т. д.).
Каждая машина следует правилу трех секунд (за исключением машины, которая стоит первой в очереди, она может ехать с любой скоростью, а все остальные машины в очереди соответствующим образом регулируют свою скорость). Каждая скорость автомобиля представлена выражением:
где «i» — это номер автомобиля, а «t» — момент времени (автомобиль с самым высоким индексом — это автомобиль, стоящий первым в очереди), а функция «f» представлена следующим кодом:
% Input x: Distance to the car in front (of you. NOT the car that is at the
% very front of the line).
% Output: Car velocity
function output = carFunc(x)
if (x >= 75)
output = 25;
else
output = x/3;
end
end
Автомобиль, который находится впереди, просто имеет постоянную скорость 'g':
В любом случае теперь, когда вы знаете контекст задачи, давайте перейдем к самой задаче. Это школьное задание состоит из нескольких шагов, и первым шагом является вычисление положения каждой машины во времени с использованием прямого/явного Эйлера, что я и сделал. Вот код для этого:
% Euler's Method
% Initial conditions and setup
g = 25; % Velocity of car M (the car that is first in line, ahead of all others) [m/s]
h = 0.01; % step size
M = 10; % Number of cars
x = 0:h:40; % the range of x (time)
n = numel(x); % the number of timesteps
posMat = zeros(M,n); % Matrix that holds positions of each car (car = row, time = column)
for i=1:M
posMat(i,1) = 10*i; % the initial positions for the cars
end
for t=1:(n-1)
% Calculate position of all cars EXCEPT car M (using the first
% equation)
for c=1:(M-1)
f = carFunc(posMat(c+1,t) - posMat(c,t)); % Velocity of car 'c'
posMat(c,t+1) = posMat(c,t) + h * f; % Explicit Euler
end
% Calculate positon of last car M (first car in line) here:
% x_M^(n+1) = x_M^n + h*g
posMat(M,t+1) = posMat(M,t) + h*g;
end
Однако проблема (где я застрял) заключается во втором шаге, где мне нужно теперь изменить свой код на первом шаге, чтобы использовать обратный/неявный эйлер через итерацию с фиксированной точкой. Я написал функцию, которая выполняет итерацию с фиксированной точкой, но помимо этого я действительно не знаю, что делать. Вот мой код для итерации с фиксированной точкой:
%Fixed-Point Iteration
%Computes approximate solution of g(x)=x
%Input: function handle g, starting guess x0,
% number of iteration steps k
%Output: Approximate solution
function out=fpi(g, x0, k)
x = zeros(1, k+1);
x(1)=x0;
for i=1:k
x(i+1)=g(x(i));
end
out=x(k+1);
end
Любая помощь приветствуется. Извините за длинный текст. Верхняя часть моего поста в основном представляет собой краткое изложение контекста задачи. Это не обязательно (и это не главное здесь), но я все равно добавил его, чтобы вы, ребята, знали, что происходит в моем коде.
Спасибо!