Построение Matlab по условным выражениям - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь построить волновое уравнение для одного временного шага t в matlab на основе массива x, который передается в функцию u.

Я не очень знаком с matlab и не уверен, что это правильный способ перебрать все значения x и построить их. Процесс кажется не совсем похожим на что-то вроде python и matplotlib.

РЕДАКТИРОВАТЬ: кажется, что этот код не выполняется должным образом, как тогда я могу перебрать массив и график? например: для элемента в x: do function

Спасибо

% defining the bounds of my x values

x=-10:.02:10;

% defining my time step, t  
t = 1;


x1=[0 0];

y1=[-0.01 0.01];

x2=[-10 10];

y2=[0 0];


% defining some constants to make below equation simpler
xpt2= x + t;

xmt2= x - t;


% plotting based on the values of x - should iterate through the array?
if abs(x) > 1

  u = 0.5 .* ((-(xpt2) .* exp(-abs(xpt2))./abs(xpt2)) + ((xmt2).*exp(-abs(xmt2))./abs(xmt2)));

  plot(x,u,x1,y1,x2,y2);

  xlabel('t=1');ylabel('u');

else    
  u = 0.5 .* abs(xpt2) + 0.5 .* abs(xmt2) + 0.5 .* (-(xpt2) .* exp(-abs(xpt2)./abs(xpt2)) + ((xmt2).*exp(-abs(xmt2))./abs(xmt2)));

  plot(x,u,x1,y1,x2,y2);

  xlabel('t=1');ylabel('u'); 

end

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Этот код может не решить вашу проблему, но может помочь вам найти ошибку. Я ожидаю ошибку в else части.

Я использую цикл for, чтобы заставить условие if работать, а способ @slayer более профессионально работать без цикла.

% defining the bounds of my x values
close all
clear 
x=-10:.02:10;
% defining my time step, t  
t = 1;
x1=[0 0];
y1=[-0.01 0.01];
x2=[-10 10];
y2=[0 0];
% defining some constants to make below equation simpler
xpt2= x + t;
xmt2= x - t;
% plotting based on the values of x - should iterate through the array?
for i=1:length(x)
    if abs(x(i)) > 1
        u(i) = 0.5 .* ((-(xpt2(i)) .* exp(-abs(xpt2(i)))./abs(xpt2(i))) + ((xmt2(i)).*exp(-abs(xmt2(i)))./abs(xmt2(i))));        
    else
        u(i) = 0.5 .* abs(xpt2(i)) + 0.5 .* abs(xmt2(i)) + 0.5 .* (-(xpt2(i)) .* exp(-abs(xpt2(i))./abs(xpt2(i))) + ((xmt2(i)).*exp(-abs(xmt2(i)))./abs(xmt2(i))));
    end
    %display step by step
    plot(x(1:i),u)
    hold on
    plot(x1,y1)
    plot(x2,y2);
    xlabel('t=1');ylabel('u');
    pause(1/1000)
end
plot(x,u)
hold on
plot(x1,y1)
plot(x2,y2);
xlabel('t=1');ylabel('u'); 
0 голосов
/ 07 января 2019

У вас есть ряд проблем с вашим кодом.

1) Ваше условное условие относится к вектору, так как вы можете проверить условное выражение для каждой точки в вашем векторе? Ну, ты не можешь таким образом.

2) Вы берете abs() вектора, но похоже, что вы хотите, чтобы отрицательные части были учтены? abs([-1 0 1]) вернет вывод [1 0 1], что сделает ваш вектор положительным и удалит отрицательные части.

Теперь я понимаю, почему вы просили for-loop проверить состояние каждой переменной x в векторе. Вы можете сделать это с помощью:

for ii=1:numel(x) % This iterates through the vector
    x(ii) % this accesses the current index of ii
end

Но вам все еще не нужен цикл for. Вместо этого используйте условный вектор для отслеживания точек нег и положений в х, например:

idx_neg = x < 0; % boolean of all negative points in x

Затем используйте idx_neg на векторе, к которому вы хотите применить уравнение. И инвертирование idx для положительных значений, таких как:

u = zeros(1, numel(x)); % initialize empty vector for storage

% for positive x values, use ~idx_neg to find the pos points
u(~idx_neg) = 0.5 .* ((-(xpt2(~idx_neg)) .* exp(-abs(xpt2(~idx_neg)))./abs(xpt2(~idx_neg))) + ((xmt2(~idx_neg)).*exp(-abs(xmt2(~idx_neg)))./abs(xmt2(~idx_neg))));

% now apply to neg points in x:
u(idx_neg) = 0.5 .* abs(xpt2(idx_neg(idx_neg))) + 0.5 .* abs(xmt2(idx_neg)) + 0.5 .* (-(xpt2(idx_neg)) .* exp(-abs(xpt2(idx_neg))./abs(xpt2(idx_neg))) + ((xmt2(idx_neg)).*exp(-abs(xmt2(idx_neg)))./abs(xmt2(idx_neg))));

Я не проверял синтаксические ошибки, но это в основном то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...