{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "using LinearAlgebra, Plots" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vamos considerar a tabela do Exercício 3 da Seção 8.1 do Burden, e aproximá-la por um poliômio $g$ de grau menor ou igual a 3 de forma a minimizar o erro qudrático\n", "$$\n", "\\sqrt{\\sum_{i=1}^6 [y_i - g(x_i)]^2},\n", "$$\n", "onde $y_i = f(x_i)$ para alguma função $f$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Podemos associar a expressão para o erro quadrático ao produto interno\n", "$$\n", "\\langle u, v\\rangle = \\sum_{i=1}^6 u(x_i)v(x_i)\n", "$$\n", "pois nesse caso\n", "$$\n", "\\langle u-v, u-v\\rangle = \\sum_{i=1}^6 [u(x_i) - v(x_i)]^2.\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Como um polinômio de grau menor ou igual 3 pode ser escrito na forma\n", "$$\n", "g(x) = a_0 + a_1x + a_2x^2 + a_3x^3\n", "$$\n", "podemos usar para a construção do sistema normal as funções\n", "$$\n", "g_0(x) = 1, \\ g_1(x) = x, \\ g_2(x) = x^2 \\ \\text{e } g_3(x) = x^3 \\ (m+1 = 4)\n", "$$" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6×2 Array{Float64,2}:\n", " 1.0 1.84\n", " 1.1 1.96\n", " 1.3 2.21\n", " 1.5 2.45\n", " 1.9 2.94\n", " 2.1 3.18" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Dados\n", "x = [1.0; 1.1; 1.3; 1.5; 1.9; 2.1]\n", "y = [1.84; 1.96; 2.21; 2.45; 2.94; 3.18]\n", "[x y]" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Figura com os dados\n", "scatter(x, y, legend=false)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6×4 Array{Float64,2}:\n", " 1.0 1.0 1.0 1.0\n", " 1.0 1.1 1.21 1.331\n", " 1.0 1.3 1.69 2.197\n", " 1.0 1.5 2.25 3.375\n", " 1.0 1.9 3.61 6.859\n", " 1.0 2.1 4.41 9.261" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Valores das funções g_j nos pontos x_i\n", "g0 = ones(6); g1 = x; g2 = x.^2; g3 = x.^3\n", "M=[g0 g1 g2 g3]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Com o produto interno definido acima, a matriz do sistema normal coincide com $M^TM$ e o lado direito do sistema normal coincide com $M^Ty$." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4×5 Array{Float64,2}:\n", " 6.0 8.9 14.17 24.023 14.58\n", " 8.9 14.17 24.023 42.8629 22.808\n", " 14.17 24.023 42.8629 79.5192 38.0962\n", " 24.023 42.8629 79.5192 151.801 67.1883" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Matriz e lado direito do sistema normal\n", "A = M'*M; b = M'*y\n", "[A b]" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4-element Array{Float64,1}:\n", " 0.6290192776395338\n", " 1.1850097957342056\n", " 0.03533252044382126\n", " -0.010047232342362707" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Solução do sistema normal\n", "a = A\\b" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "g (generic function with 1 method)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Polinômio de grau 3 que ajusta a tabela\n", "g(x) = a[1] + a[2]*x + a[3]*x^2 + a[4]*x^3" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xx = collect(1.0:0.001:2.1) # Pontos para desenhar o gráfico de g\n", "plot!(xx, g.(xx)) # gráfico de g mais os pontos da tabela" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Julia 1.5.1", "language": "julia", "name": "julia-1.5" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.5.1" } }, "nbformat": 4, "nbformat_minor": 4 }