De Huber-functie met parameter $$\delta > 0$$ wordt gedefinieerd als:
$$
L(x;\delta)=\left\{
\begin{array}{rl}
\frac{1}{2}x^2 & \text{voor} |x| \le \delta\\
\delta \times (|x| - \frac{1}{2}\delta) & \text{voor} |x| \gt \delta\\
\end{array} \right.
$$
Programmeer de gevectoriseerde functie huber()
, met als argumenten:
- het argument $$x$$:
- Indien dit argument een reëel getal is, wordt de huberfunctie voor dit enkele
argument teruggegeven (dus een float).
- Indien dit argument een NumPy-rij is, wordt een NumPy-rij als resultaat teruggegeven, waarbij
de huberfunctie in elk van de argumenten berekend wordt (op plaats $$i$$ staat dus de waarde die de
huberfunctie voor de waarde op plaats $$i$$ van het argument oplevert).
- de waarde van de parameter $$\delta$$ (je mag aannemen dat hier een strikt positief reëel getal
opgegeven wordt.)
Merk op: indien het argument een NumPy-rij is, wordt het resultaat van je functie, ten behoeve van de evaluatie in Dodona, naar een lijst omgezet waarbij afgekapt wordt op 6 decimalen.
Het resultaat van je functie MOET wel degelijk een NumPy-rij zijn. Daarnaast zal je resultaat ook afgebroken worden op 6 cijfers na de komma (de functies
format_p()
en
prec()
die je in het verbeterscript ziet verschijnen, zorgen hiervoor).
Voorbeeld
huber(np.linspace(-1.0, 1.0, 21), 0.5) = [ 0.375 0.325 0.275 0.225 0.175 0.125 0.08 0.045 0.02 0.005 0.
0.005 0.02 0.045 0.08 0.125 0.175 0.225 0.275 0.325 0.375]
huber(-0.5, 0.5) = 0.125