Sugeriría simplemente aproximando la función $\max(0,\cdot)$, y luego usar eso para implementar $\max(0,1-x^2)$. Este es un problema muy estudiado, ya que $\max(0,\cdot)$ es la función relu que actualmente es ubicua en aplicaciones de aprendizaje automático. Una posibilidad es $$ \max(0,y) \approx \mu(w)(y) = \frac{y}2 + \sqrt{\frac{y^2}4 + w} $$
Una forma de derivar esta fórmula: es la inversa del rango positivo de $x\mapsto x-\tfrac{w}x$.
Luego, compuesto con el cuadrático, esto se ve así:
Nota cómo, a diferencia de las sugerencias de Calvin Khor, esto evita llegar a ser negativo y es más fácil de adoptar para otras parábolas.
Nathaniel señala que este enfoque no conserva la altura del pico. No sé si eso importa en absoluto, pero si lo hace, la solución más simple es simplemente reescalar la función con un factor constante. Sin embargo, eso requiere conocer el máximo real de la propia parábola (en mi caso, 1).
Para obtener una mejor coincidencia con el pico original, puedes definir una versión de $\mu$ cuyos dos primeros coeficientes de Taylor alrededor de 1 sean ambos 1 (es decir, como la identidad), reescalando tanto el resultado como la entrada (esto explota la regla de la cadena): $$\begin{align} \mu_{1(1)}(w,y) :=& \frac{\mu(w,y)}{\mu(1)} \\ \mu_{2(1)}(w,y) :=& \mu_{1(1)}\left(w, 1 + \frac{y - 1}{\mu'_{1(1)}(w,1)}\right) \end{align}$$
Y con eso, este es tu resultado:
Lo bueno de esto es que la expansión de Taylor alrededor de 0 te devolverá la parábola original (sin restricciones) exacta.
Código fuente (Haskell con dynamic-plot):
import Graphics.Dynamic.Plot.R2
import Text.Printf
μ₁₁, μ₁₁', μ₂₁ :: Double -> Double -> Double
μ₁₁ w y = (y + sqrt (y^2 + 4*w))
/ (1 + sqrt(1 + 4*w))
μ₁₁' w y = (1 + y / sqrt (y^2 + 4*w))
/ (1 + sqrt(1 + 4*w))
μ₂₁ w y = μ₁₁ w $ 1 + (y-1) / μ₁₁' w 1
q :: Double -> Double
q x = 1 - x^2
main :: IO ()
main = do
plotWindow
[ plotLatest [ plot [ legendName (printf "μ₂₍₁₎(w,q(x))")
. continFnPlot $ μ₂₁ w . q
, legendName (printf "w = %.2g" w) mempty
]
| w <- (^1500).recip<$>[1,1+3e-5..]]
, legendName "max(0,q x)" . continFnPlot
$ max 0 . q, xAxisLabel "x"
, yInterval (0,1.5)
, xInterval (-1.3,1.3) ]
return ()