Как написать код MATLAB для такого шага Хевисайда? - PullRequest
0 голосов
/ 07 мая 2019

Для решения одномерного уравнения адвекции, обозначенного

u_t + u_x = 0, u = u (x, t) и т. Д. и (х, 0) = 1 + Н (х + 1) + Н (х-1)

с использованием метода Лакса Вандероффа, Мне нужно написать шаговую функцию Хевисайда H (x), и она должна быть равна нулю, когда x <= 0, 1, когда x> 0. Проблема в том, что мне также нужно использовать эту функцию, записывающую H (x-t + 1), H (x-t-1), так как я буду сравнивать то, что я нахожу по точному решению:

u (x, t) = 1 + H (x-t + 1) -H (x-t-1)

Здесь "x" и "t" - векторы, такие, что;

x=-5:0.05:5

t=0:0.05:1

Я написал шаговую функцию Хевисайда следующим образом; однако мне это нужно без цикла for.

L=length(x)

function H_X= heavisidefunc(x,L)
H_X=zeros(1,L);
for i= 1:L
    if x(i)<= 0
        H_X(i)=0;
    else
        H_X(i)=1;
    end
end
end

Я получаю «Размеры должны совпадать». ошибка, если я напишу

H_X3 = heavisidefunc(x-t+1,L);
H_X4 = heavisidefunc(x-t-1,L);

Ответы [ 2 ]

1 голос
/ 08 мая 2019

Я придумал решение.Моя новая функция Хевисайда:


function H_X= heavisidefunc(x)

    if x<= 0
        H_X=0;
    else
        H_X=1;
    end
end

Проблема, с которой я столкнулся, заключалась в том, что я сохранял выходные данные как вектор, и это просто усложняло вещи.Теперь написать H (x-t + 1), H (xt-1) стало проще.Просто поместите «heavyisidefunc (x (i) -t (j) -1))» и сделайте цикл от 1 до длины x и l в двух циклах.Спасибо всем!

1 голос
/ 08 мая 2019

Функция Heavyside действительно легко программируется в Matlab

Heavyside=@(x) x>= 0;

Самый простой способ избавиться от измерений должен согласиться с ошибкой - это транспонировать один из векторов. Это заставит Matlab построить матрицу length(x1) на length(x2)

Heavyside(x-t'+1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...