{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Interpolação Lagrangeana Baricêntrica\n",
"## Nelson Kuhl - IME/USP"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Algoritmos para interpolação lagrangeana baricêntrica, conforme descrito em Berrut & Trfethen, *Barycentric Lagrange Interpolation*, SIAM Review 46(3) (2004), pp. 501--517."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Considere a tabela\n",
"$$\n",
" \\begin{array}{c|cccc}\n",
" x & x_0 & x_1 & \\dots & x_n \\\\\n",
" \\hline\n",
" y & y_0 & y_1 & \\dots & y_n\n",
" \\end{array} ,\n",
"$$\n",
"com $x_i \\ne x_j$ se $i \\ne j$.\n",
"Então, o polinômio interpolador $p_n$ da tabela na forma de Lagrange é dado por\n",
"$$\n",
" p_n(x) = \\sum_{j=0}^n y_j L_j(x)\n",
"$$\n",
"onde os polinômios de Lagrange $L_j$ são definidos por\n",
"$$\n",
" L_j(x) = \\prod^n_{\\substack{k = 0 \\\\ k \\ne j}} \\frac{x - x_k}{x_j - x_k}, \\quad 0 \\le j \\le n.\n",
"$$\n",
"Manipulando-se as fórmulas acima podemos escrever a fórmula de Lagrange modificada\n",
"$$\n",
" p_n(x) = L(x) \\sum_{j=0}^n \\frac{\\omega_j}{x - x_j}y_j, \\quad x \\ne x_i,\\ 0 \\le i \\le n,\n",
"$$\n",
"onde\n",
"$$\n",
"L(x) = (x - x_0)(x - x_1) \\dots (x - x_n)\n",
"$$\n",
"e os **pesos baricêntricos** $\\omega_j$ são definidos como\n",
"$$\n",
" \\omega_j = \\frac{1}{\\prod^n_{\\substack{k=0 \\\\ k \\ne j}}(x_j - x_k)}, \\quad 0 \\le j \\le n .\n",
"$$\n",
"Sabendo-se que se $y_i = 1$, $0 \\le i \\le n$, então $p_n(x) = 1$, $\\forall x \\in \\mathbb{R}$, obtemos\n",
"$$\n",
" 1 = L(x)\\sum_{j=0}^n \\frac{\\omega_j}{x - x_j}, \\quad \\forall x \\ne x_i,\\ 0 \\le i \\le n,\n",
"$$\n",
"o que nos dá a **fórmula baricêntrica**\n",
"$$\n",
" p_n(x) = \\frac{\\sum_{j=0}^n\\frac{\\omega_j}{x - x_j}y_j}{\\sum_{m=0}^n\\frac{\\omega_m}{x - x_m}},\n",
" \\quad x \\ne x_i,\\ 0 \\le i \\le n.\n",
"$$"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"weight_bary (generic function with 1 method)"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"function weight_bary(xdata, xspace_query)\n",
" #= Cálculo dos pesos para a interpolação Lagrangeana baricêntrica.\n",
" Há três opções de \"strings\" para o argumento afanumérico\n",
" xspace_query: \"equi\", \"cheby2\" e \"arb\". Qualquer outro valor\n",
" retorna nada. =#\n",
" if xspace_query == \"equi\" # Pontos equidistantes\n",
" n = length(xdata) - 1\n",
" return float( ((-1) .^ (0:n)) .* binomial.(n, 0:n) )\n",
" elseif xspace_query == \"cheby2\" # Pontos de chebyshev do segundo tipo\n",
" n = length(xdata) - 1\n",
" d = [0.5; ones(n-1); 0.5]\n",
" return ((-1) .^ (0:n)) .* d\n",
" elseif xspace_query == \"arb\" # Pontos arbitrários\n",
" m = length(xdata)\n",
" v = zeros(m)\n",
" for j in 1:m\n",
" aux = xdata[j] .- xdata\n",
" mask = .~ map(iszero, aux) # Apenas os índices dos não-nulos\n",
" v[j] = prod(aux[mask]) # para o cálculo do produto\n",
" end\n",
" return 1.0 ./ v\n",
" else\n",
" println(\"Tente outra vez\")\n",
" return nothing\n",
" end\n",
"end"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"eval_bary (generic function with 1 method)"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"function eval_bary(x, xdata, ydata, w)\n",
" #= Cálculo do valor no ponto x do polinômio interpolador\n",
" da tabela (xdata, ydata) usando a fórmula baricêntrica,\n",
" onde os pesos w relativos aos pontos xdata foram\n",
" previamente calculados.\n",
" OBSERVAÇÃO: x pode ser escalar ou vetor =#\n",
"\n",
" numer = zeros(length(x)); denom = zeros(length(x))\n",
" ind0 = Int[]; pos0 = Int[] # Para o caso de x coincidir com pontos da tabela\n",
" for j in 1:length(xdata)\n",
" xdiff = x .- xdata[j]\n",
" temp = w[j] ./ xdiff # Pode haver divisão por zero, que será eliminada abaixo\n",
" numer = numer .+ temp*ydata[j]\n",
" denom = denom .+ temp\n",
" i0 = findfirst(iszero, xdiff) # Verifica se há ponto da tabela em x\n",
" if i0 != nothing\n",
" push!(ind0, j) # Posição em xdata\n",
" push!(pos0, i0) # Posição em xx\n",
" end\n",
" end\n",
" y = numer ./ denom\n",
" if (length(ind0) != 0) # Caso haja pontos da tabela em x \n",
" y[pos0] = ydata[ind0]\n",
" end\n",
" return y\n",
"end"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Exemplo da aula\n",
"$$\n",
" \\begin{array}{c|rccc}\n",
" x & -1 & 0 & 1 & 2 \\\\\n",
" \\hline\n",
" 2^x & 0.5 & 1 & 2 & 4\n",
" \\end{array}\n",
"$$"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"2×4 Array{Float64,2}:\n",
" -1.0 0.0 1.0 2.0\n",
" 0.5 1.0 2.0 4.0"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"xdata = collect(-1:2)\n",
"ydata = 2.0 .^ xdata\n",
"[xdata'; ydata']"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1×4 LinearAlgebra.Adjoint{Float64,Array{Float64,1}}:\n",
" 1.0 -3.0 3.0 -1.0"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"w = weight_bary(xdata, \"equi\") # Os pontos são igualmente espaçados\n",
"w'"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1×4 LinearAlgebra.Adjoint{Float64,Array{Float64,1}}:\n",
" -0.166667 0.5 -0.5 0.166667"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"weight_bary(xdata, \"arb\")' # Apenas para confirmar que são múltiplos dos anteriores"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1-element Array{Float64,1}:\n",
" 1.4062500000000002"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y = eval_bary(0.5, xdata, ydata, w) # Aproximação para a raiz quadrada de 2"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"#= Valores do polinômio interpolador em pontos equidistantes\n",
" com espaçamento 0.001 no intervalo [-1,2] =#\n",
"xx = collect(-1:0.001:2)\n",
"yy = eval_bary(xx, xdata, ydata, w);"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"using Plots # Vamos gerar alguns gráficos"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"scatter(xdata, ydata, label = \"tabela\", legend = :topleft)\n",
"plot!(xx, yy, label = \"p3\")"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ff = 2.0 .^ xx\n",
"plot!(xx, ff, label = \"2^x\") # Para comparar com a função 2^x"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.016658019361980525"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"using LinearAlgebra\n",
"norm(ff-yy, Inf) # Erro nos pontos xx"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Exemplo de Runge\n",
"$$\n",
" f(x) = \\frac{1}{1 + x^2},\\quad x \\in [-5,5]\n",
"$$\n",
"com polinômios interpoladores em pontos igualmente espaçados no intervalo."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"f (generic function with 1 method)"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"f(x) = 1/(1 + x^2)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Exemplo de Runge, 3 pontos igualmente espaçados\n",
"xx = collect(-5:0.001:5)\n",
"n1 = 3\n",
"xdata = collect(range(-5, stop=5, length=n1))\n",
"ydata = f.(xdata)\n",
"w = weight_bary(xdata, \"equi\")\n",
"yy = eval_bary(xx, xdata, ydata, w)\n",
"ff = f.(xx)\n",
"scatter(xdata, ydata, label = \"tabela\")\n",
"plot!(xx, ff, label = \"func\")\n",
"plot_3equi = plot!(xx, yy, label = \"polint equi\") # Será usado depois para comparação\n",
"plot(plot_3equi)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"n1 = 5 # 5 pontos igualmente espaçados\n",
"xdata = collect(range(-5, stop=5, length=n1))\n",
"ydata = f.(xdata)\n",
"w = weight_bary(xdata, \"equi\")\n",
"yy = eval_bary(xx, xdata, ydata, w)\n",
"scatter(xdata, ydata, label = \"tabela\")\n",
"plot!(xx, ff, label = \"func\")\n",
"plot_5equi = plot!(xx, yy, label = \"polint equi\")\n",
"plot(plot_5equi)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"n1 = 7 # 7 pontos igualmente espaçados\n",
"xdata = collect(range(-5, stop=5, length=n1))\n",
"ydata = f.(xdata)\n",
"w = weight_bary(xdata, \"equi\")\n",
"yy = eval_bary(xx, xdata, ydata, w)\n",
"scatter(xdata, ydata, label = \"tabela\")\n",
"plot!(xx, ff, label = \"func\")\n",
"plot_7equi = plot!(xx, yy, label = \"polint equi\")\n",
"plot(plot_7equi)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"n1 = 9 # 9 pontos igualmente espaçados\n",
"xdata = collect(range(-5, stop=5, length=n1))\n",
"ydata = f.(xdata)\n",
"w = weight_bary(xdata, \"equi\")\n",
"yy = eval_bary(xx, xdata, ydata, w)\n",
"scatter(xdata, ydata, label = \"tabela\")\n",
"plot!(xx, ff, label = \"func\")\n",
"plot_9equi = plot!(xx, yy, label = \"polint equi\")\n",
"plot(plot_9equi)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"n1 = 11 # 11 pontos igualmente espaçados\n",
"xdata = collect(range(-5, stop=5, length=n1))\n",
"ydata = f.(xdata)\n",
"w = weight_bary(xdata, \"equi\")\n",
"yy = eval_bary(xx, xdata, ydata, w)\n",
"scatter(xdata, ydata, label = \"tabela\")\n",
"plot!(xx, ff, label = \"func\")\n",
"plot_11equi = plot!(xx, yy, label = \"polint equi\")\n",
"plot(plot_11equi)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"n1 = 17 # 17 pontos igualmente espaçados\n",
"xdata = collect(range(-5, stop=5, length=n1))\n",
"ydata = f.(xdata)\n",
"w = weight_bary(xdata, \"equi\")\n",
"yy = eval_bary(xx, xdata, ydata, w)\n",
"scatter(xdata, ydata, label = \"tabela\")\n",
"plot!(xx, ff, label = \"func\")\n",
"plot_17equi = plot!(xx, yy, label = \"polint\")\n",
"plot(plot_17equi)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"n1 = 33 # 33 pontos igualmente espaçados\n",
"xdata = collect(range(-5, stop=5, length=n1))\n",
"ydata = f.(xdata)\n",
"w = weight_bary(xdata, \"equi\")\n",
"yy = eval_bary(xx, xdata, ydata, w)\n",
"scatter(xdata, ydata, label = \"tabela\")\n",
"plot!(xx, ff, label = \"func\")\n",
"plot_33equi = plot!(xx, yy, label = \"polint\")\n",
"plot(plot_33equi)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Pontos de Chebyshev de segunda espécie\n",
"n = 20; xx = cos.((0:n)*pi/n)\n",
"scatter(xx, zeros(n+1), label = \"Cheby2\")"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"# Exemplo de Runge usando os pontos de Chebyshev de segunda espécie transformados para o intervalo [-5,5]"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Exemplo de Runge, 3 pontos de Chebyshev de segunda espécie transformados para o intervalo [-5,5]\n",
"xx = collect(-5:0.001:5)\n",
"n = 2 # n + 1 = 3\n",
"xdata = 5*cos.((n:-1:0)*pi/n)\n",
"ydata = f.(xdata)\n",
"w = weight_bary(xdata, \"cheby2\")\n",
"yy = eval_bary(xx, xdata, ydata, w)\n",
"ff = f.(xx)\n",
"scatter(xdata, ydata, label = \"tabela\")\n",
"plot!(xx, ff, label = \"func\")\n",
"plot_3cheby = plot!(xx, yy, label = \"polint cheby\")\n",
"plot(plot_3cheby, plot_3equi, size = (950, 300))"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Exemplo de Runge, 5 pontos de Chebyshev de segunda espécie transformados para o intervalo [-5,5]\n",
"n = 4 # n + 1 = 5\n",
"xdata = 5*cos.((n:-1:0)*pi/n)\n",
"ydata = f.(xdata)\n",
"w = weight_bary(xdata, \"cheby2\")\n",
"yy = eval_bary(xx, xdata, ydata, w)\n",
"scatter(xdata, ydata, label = \"tabela\")\n",
"plot!(xx, ff, label = \"func\")\n",
"plot_5cheby = plot!(xx, yy, label = \"polint cheby\")\n",
"plot(plot_5cheby, plot_5equi, size = (950, 300))"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Exemplo de Runge, 7 pontos de Chebyshev de segunda espécie transformados para o intervalo [-5,5]\n",
"n = 6 # n + 1 = 7\n",
"xdata = 5*cos.((n:-1:0)*pi/n)\n",
"ydata = f.(xdata)\n",
"w = weight_bary(xdata, \"cheby2\")\n",
"yy = eval_bary(xx, xdata, ydata, w)\n",
"scatter(xdata, ydata, label = \"tabela\")\n",
"plot!(xx, ff, label = \"func\")\n",
"plot_7cheby = plot!(xx, yy, label = \"polint cheby\")\n",
"plot(plot_7cheby, plot_7equi, size = (950, 300))"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Exemplo de Runge, 9 pontos de Chebyshev de segunda espécie transformados para o intervalo [-5,5]\n",
"n = 8 # n + 1 = 9\n",
"xdata = 5*cos.((n:-1:0)*pi/n)\n",
"ydata = f.(xdata)\n",
"w = weight_bary(xdata, \"cheby2\")\n",
"yy = eval_bary(xx, xdata, ydata, w)\n",
"scatter(xdata, ydata, label = \"tabela\")\n",
"plot!(xx, ff, label = \"func\")\n",
"plot_9cheby = plot!(xx, yy, label = \"polint cheby\")\n",
"plot(plot_9cheby, plot_9equi, size = (950, 300))"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Exemplo de Runge, 11 pontos de Chebyshev de segunda espécie transformados para o intervalo [-5,5]\n",
"n = 10 # n + 1 = 11\n",
"xdata = 5*cos.((n:-1:0)*pi/n)\n",
"ydata = f.(xdata)\n",
"w = weight_bary(xdata, \"cheby2\")\n",
"yy = eval_bary(xx, xdata, ydata, w)\n",
"scatter(xdata, ydata, label = \"tabela\")\n",
"plot!(xx, ff, label = \"func\")\n",
"plot_11cheby = plot!(xx, yy, label = \"polint cheby\")\n",
"plot(plot_11cheby, plot_11equi, size = (950, 300))"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Exemplo de Runge, 17 pontos de Chebyshev de segunda espécie transformados para o intervalo [-5,5]\n",
"n = 16 # n + 1 = 17\n",
"xdata = 5*cos.((n:-1:0)*pi/n)\n",
"ydata = f.(xdata)\n",
"w = weight_bary(xdata, \"cheby2\")\n",
"yy = eval_bary(xx, xdata, ydata, w)\n",
"scatter(xdata, ydata, label = \"tabela\")\n",
"plot!(xx, ff, label = \"func\")\n",
"plot_17cheby = plot!(xx, yy, label = \"polint cheby\")\n",
"plot(plot_17cheby, plot_17equi, size= (950, 300))"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Exemplo de Runge, 33 pontos de Chebyshev de segunda espécie transformados para o intervalo [-5,5]\n",
"n = 32 # n + 1 = 33\n",
"xdata = 5*cos.((n:-1:0)*pi/n)\n",
"ydata = f.(xdata)\n",
"w = weight_bary(xdata, \"cheby2\")\n",
"yy = eval_bary(xx, xdata, ydata, w)\n",
"scatter(xdata, ydata, label = \"tabela\")\n",
"plot!(xx, ff, label = \"func\")\n",
"plot_33cheby = plot!(xx, yy, label = \"polint cheby\")\n",
"plot(plot_33cheby, plot_33equi, size = (950, 300))"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.0016181898065479872"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"norm(ff-yy, Inf)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Exemplo de Runge, 65 pontos de Chebyshev de segunda espécie transformados para o intervalo [-5,5]\n",
"n = 64 # n + 1 = 65\n",
"xdata = 5*cos.((n:-1:0)*pi/n)\n",
"ydata = f.(xdata)\n",
"w = weight_bary(xdata, \"cheby2\")\n",
"yy = eval_bary(xx, xdata, ydata, w)\n",
"scatter(xdata, ydata, label = \"tabela\")\n",
"plot!(xx, ff, label = \"func\")\n",
"plot!(xx, yy, label = \"polint cheby\")"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"2.86537823868116e-6"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"norm(ff-yy, Inf)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.5.2",
"language": "julia",
"name": "julia-1.5"
},
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "1.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}