How to use if, if I want to locate something in a matrix

2 次查看(过去 30 天)
I am trying to model a streamline with a pumping well. I have an equation describing the position of the streamline, however, the analytical solution fails at the well location. What I want is to locate the cells that misbehave in matrix U, which equal (xi+or-2) and (yi+or-2) and make them equal to xi and yi. I tried if (..) function but I havent been successful. Any aid is appreciated. Thanks, Eric
theta = 135; %degrees
Q = 10000; %ft^3/day
xi = 10; %Well X Position
yi = -10;%Well Y position
q = 1.5
B= 300
Psi = @(m,d) q*sin(theta)*m - q*cos(theta)*d - Q./(2*pi*B)*atan(((m-xi)./(d-yi))); %
D = []; %matrix to contain results from Psi(x,y)
m = 9;%starting x position of particle
d = -9;%starting y position of particle
E= Psi(m,d); %evaluation of Psi for initial position
D = [D;E,m,d];%store Psi in D
%Psi2 equation used in the fzero equation
Psi2 = @(x,y) q*sin(theta)*x - q*cos(theta)*y - Q./(2*pi*B)*atan(((x-xi)./(y-yi))) - D(1,1);% where D(1,1) is the initial Psi value obtained from above.
U = [];%matrix created to contain results of fzero(Psi2).
for y = (d-25):(abs(d)+25); %Y values of particles
x0 = [-5000 5000]; %initial guess for fzero
[x1]= fzero(@(x) Psi2(x,y),x0); %fzero calculation
U=[U;x1, y];
end
% if U(:,1) == (xi-2) && U(:,2) == (yi-2)
% U(:,1) = xi
% elseif U(:,1)>x1;
% x1=x1;
% else U(:,1)<x1;
% x1=x1;
% end
plot(U(:,1), U(:,2), 'k')
xlabel 'x (ft)'
ylabel 'y (ft)'
hold on
plot (xi, yi,'r X')
plot (m,d,'g O')
  1 个评论
KSSV
KSSV 2016-9-28
Plot gives a straight line with a kink close to xi,yi...you want to remove that kink.Is it? Can you be bit more clear about the task.

请先登录,再进行评论。

采纳的回答

Mudambi Srivatsa
Mudambi Srivatsa 2016-9-29
I understand that you want to use "if" to find the cells that misbehave in matrix U which equal (xi+or-2) and (yi+or-2) and replace them with 'xi' and 'yi' respectively. The issue is because of the '&&' operator that works for scalar arguments. The operations U(:,1) == (xi-2) and U(:,2) == (yi-2) will each result in a vector and you cannot use '&&' operator. So, you should use '&' operator that works for vector operands.
It is not clear what you exactly meant by (xi+or-2). I am assuming (xi+or-2) means either xi+2 or xi-2 but not the range [xi-2 xi+2] from the commented code. The following code should work for replacing the values with 'xi', 'yi' when matrix values are (xi+or-2) and (yi+or-2).
% find indices where x and y elements are both (+or-2)
ind = (abs(U(:,1) - xi) == 2) & (abs(U(:,2) - yi) == 2)
% replace matching x elements with new value
U(ind,1) = xi;
% replace matching y elements with new value
U(ind,2) = yi;
If (xi+or-2) meant the range [xi-2 xi+2], you can modify the code as follows:
% find indices where x and y elements are both (+or-2)
ind = (abs(U(:,1) - xi) <= 2) & (abs(U(:,2) - yi) <= 2)
% replace matching x elements with new value
U(ind,1) = xi;
% replace matching y elements with new value
U(ind,2) = yi;

更多回答(1 个)

Eric Daiber
Eric Daiber 2016-9-29
Thanks, I used the following code where z = U. Where if the inverse slope increased over 10, I truncated the remaining values.
for i = 2:(numel(z)/2);
if abs((z(i,1)-z(i-1,1))/(z(i,2)-z(i-1,2))) > 10 ;
z(i:(numel(z)/2),1) = z(i-1,1);
z(i:(numel(z)/2),2) = z(i-1,2);
break
end
end

类别

Help CenterFile Exchange 中查找有关 Whos 的更多信息

标签

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by