Multivariable piecewise functions: Julia-basics help

Hi, I was wondering how to create a piecewise function of two variables

r(x,y) = \begin{cases} f(x,y) & d(x,y)\geq 0 \\ g(x,y) & d(x,y)<0\end{cases} and use it to plot the coordinate pair (x',y')= (m(x,y), n(x,y)) on xy- plane where both m and n are scalar [but also functions of r(x,y)].

So far I thought of creating x= -10:10 and y : -10:10 and to store their values in arrays and then just output array of m and n values. Is it the correct thought process? End goal is to plot (m,n) based on (x,y) based on different values of a. Sorry for the basic doubts. Any help is appreciated. Thanks.

a= 1/2
g(x) = a*x^2

function p(y)
return -(2a*y-1)^2
end

function q(x,y)
return ((2a*y-1)^3-(27a^2)*(x^2))
end

function del(x,y)
return (a^2*x^2-2(a*y-1)^3)*x^2
end

function r(x,y)
if all(del(x,y) .>= 0)
return -(a*y+1)./(3a)
else
return (a*y+1)./(3a)
end
end

x = range(0, 50, length=100);
y = range(0, 50, length=100);
#plot(m,n)??

I wouldnâ€™t do it this way. Just define a function to work on scalar inputs, and then broadcast it. (And itâ€™s good style to avoid non-constant globals, i.e. pass a as a parameter.)

e.g.

del(x,y,a=1/2) = ((a^2*x^2-2(a*y-1)^3)*x^2
r(x,y,a=1/2) = del(x,y,a) â‰Ą 0 ? -(a*y+1)/(3a) : (a*y+1)/(3a)

x = y = range(-10,10, length=100)
z = del.(x, y') # 100Ă—100 grid of values for plotting


Get out of the habit (from Matlab or Python or R) of trying to define â€śvectorizedâ€ť functions for things that are logically scalar. Scalar functions are fast in Julia, and are easier to work with.

1 Like

Thanks a lot for your answer, it helped. Thank you for the advice as well [beginning to learn Julia].