Een reële functie $$f(x_0, x_1, ... ,x_{N-1})$$ wordt in een NumPy-tabel $$\mathbf{X}$$ bijgehouden. De tabel bevat $$M$$ rijen, en per rij vinden we de argumentwaarden $$x_0, ..., x_{N-1}$$ terug, gevolgd door de bijhorende functiewaarde. De tabel bevat dus $$N+1$$ kolommen (namelijk $$N$$ kolommen om de argumenten bij te houden, en 1 kolom om de bijhorende functiewaarde op te slaan).

Als voorbeeld geven we onderstaande tabel, waarin de functie $$s(x_0, x_1, x_2) = x_0 + 2x_1 + 3x_3$$ via een tabel in een beperkt aantal punten weergegeven wordt ($$N = 3, M = 4$$).

$$ \left( \begin{array}{cccc} -1.0 & -1.0 & -1.0 & -6.0\\ 0.0 & 0.0 & 0.0 & 0.0\\ 1.0 & 1.0 & 1.0 & 6.0\\ 1.0 & 2.0 & 3.0 & 14.0 \end{array} \right) $$

Om nu de functiewaarde in een willekeurig argument $$(x_0^*, x_1^*, x_2^*, ..., x_{N-1}^*)$$ te bepalen, gebruiken we onderstaand eenvoudig algoritme:

  1. zoek alle argumenten in de tabel $$\mathbf{X}$$ waarvoor de Euclidische afstand tot $$(x_0^*, x_1^*, x_2^*, ..., x_{N-1}^*)$$ strikt kleiner is dan $$eps$$ (met $$eps$$ een strikt positief getal)
  2. indien je geen dergelijke argumenten vindt, is het resultaat van de functie de waarde 0.0, in het andere geval bereken je de functiewaarde in $$(x_0^*, x_1^*, x_2^*, ..., x_{N-1}^*)$$ als het gemiddelde van de functiewaarden in de argumenten die je in vorige stap gevonden hebt

Schrijf een functie functie_benadering() met drie argumenten, namelijk:

Het resultaat van de methode is de gezochte functiewaarde (type float).

Voorbeeld

X =  np.array(
[[ 0.,  1.,  2.,  3.], 
[-1., -2., 5., 7.], 
[3., 2., 9., 1.], 
[-5., -3., 2., 0.], 
[-1.05, -2., 5., 8.]]) 
x = np.array([-1., -2., 5.])
print(functie_benadering(X, x, 0.1)) #7.5