I would like to exclude the point {x=0,y=0} in the function definition
f = Function[{x, y}, {x/(x^2 + y^2), -(y/(x^2 + y^2))}]
So far I tried ConditionalExpressionand /; without success.
Thanks!
I would like to exclude the point {x=0,y=0} in the function definition
f = Function[{x, y}, {x/(x^2 + y^2), -(y/(x^2 + y^2))}]
So far I tried ConditionalExpressionand /; without success.
Thanks!
As far as I know, you cannot have a pure function that holds its arguments depending on a condition on the arguments. Condition specifically works with pattern matching and pure functions don't use the pattern matcher. So the behaviour that f[0, 0] doesn't evaluate simply cannot be achieved with a pure function.
The alternative is some sort of default return value. Probably the easiest way to do this, is with something like If, Switch or Which:
f = Function[{x, y},
If[ TrueQ[x == 0 || y == 0],
Undefined,
{x/(x^2 + y^2), -(y/(x^2 + y^2))}
]
];
f[0, 0]
Undefined
Note the use of TrueQ, which is necessary to deal with the case f[a, b] where a and b are symbols. The If will not evaluate otherwise, since a == 0 and b == 0 remain unevaluated (because they are equation, not truth statements). The test x === 0 is not useful here either, since 0. === 0 evaluates to False. PossibleZeroQ[x] is another test you could use in the If statement.
Undefined
– Ulrich Neumann
Aug 08 '19 at 12:15
Here's a fun variant on Sjoerd's approach using #0 as a recursive reference
f = Function[
With[{x = #1, y = #2},
If[TrueQ[x == 0 || y == 0],
Unevaluated @@ Hold[#0[##]],
{x/(x^2 + y^2), -(y/(x^2 + y^2))}
]
]
];
This gives
f[0, 0]
Unevaluated[
(With[{x = #1, y = #2},
If[TrueQ[x == 0 || y == 0],
Unevaluated @@ Hold[#0[##1]], {x/(x^2 + y^2), -(y/(x^2 + y^2))}]] &)[0, 0]
]
f[0,0]? – Lukas Lang Aug 08 '19 at 11:14{0,0}or should returnNull! – Ulrich Neumann Aug 08 '19 at 11:16Ifor similar to do the check. As far as I am aware,Functionwill always evaluate when it is applied to something. Depending on the amount of conditions, you could use e.g.Replace[{##},{{0,0}->Null,{x_,y_}:>{x^2,y^2}}]&orReplace[{##},{{x_,y_}/;x!=0||y!=0:>{x^2,y^2},_->Null}]&to have a syntax more similar to traditional downvalue definitions – Lukas Lang Aug 08 '19 at 11:24TransformedRegion. A possible workaround could be the definition of a region thereby excluding the point{0,0}. – Ulrich Neumann Aug 08 '19 at 11:27TransformedRegion, I don't recommend using the return valueNull. It's probably not the correct return for "this thing doesn't exists".Undefinedis probably better.Nullis a programmatic value, not a mathematical one. – Sjoerd Smit Aug 08 '19 at 11:31