{"id":5165,"date":"2024-03-21T16:32:38","date_gmt":"2024-03-21T15:32:38","guid":{"rendered":"https:\/\/gdksoftware.com\/?post_type=knowledge&#038;p=5165"},"modified":"2024-03-21T16:32:38","modified_gmt":"2024-03-21T15:32:38","slug":"curva-polinomial-de-melhor-ajuste","status":"publish","type":"knowledge","link":"https:\/\/gdksoftware.com\/pt-br\/base-de-conhecimento\/curva-polinomial-de-melhor-ajuste","title":{"rendered":"Curva polinomial de melhor ajuste"},"content":{"rendered":"<h3>Contexto<\/h3>\n<p>Recentemente, um cliente nos solicitou que calcul\u00e1ssemos uma curva de melhor ajuste para um conjunto de pontos. O software que est\u00e1vamos implementando \u00e9 usado para acionar uma m\u00e1quina de usinagem de metais e precisava produzir uma sa\u00edda que fosse uma curva suave, com base em um conjunto de pontos amostrados. Tendo trabalhado em problemas semelhantes anteriormente, eu tinha uma ideia aproximada de como isso deveria funcionar matematicamente, mas, como geralmente acontece no desenvolvimento de software, eu tinha certeza de que algu\u00e9m j\u00e1 teria resolvido esse problema espec\u00edfico.<\/p>\n<h3>Requisitos<\/h3>\n<p>Temos um conjunto de pontos com coordenadas X e Y. O software precisa calcular uma curva que seja o melhor ajuste para os pontos. Ao fazer isso, ele tamb\u00e9m deve introduzir pontos intermedi\u00e1rios adicionais para que a curva seja a mais suave poss\u00edvel. Por exemplo, para um conjunto de entrada de 400 pontos, o software produzir\u00e1 5.000 pontos que se encontram na curva de melhor ajuste.<\/p>\n<h3>Pesquisa<\/h3>\n<p>Uma r\u00e1pida pesquisa no Google identificou algumas poss\u00edveis solu\u00e7\u00f5es Delphi para esse problema.<\/p>\n<p>A que parecia mais promissora era a unidade de ajuste de curva de m\u00ednimos quadrados de David Taylor: <a href=\"https:\/\/www.satsignal.eu\/software\/components.html#CurveFit\">https:\/\/www.satsignal.eu\/software\/components.html#CurveFit<\/a><\/p>\n<p>Essa era uma \u00fanica unidade Delphi que n\u00e3o tinha depend\u00eancias de componentes de terceiros e simplesmente usava a unidade System.Math.<br \/>\nA rotina foi escrita em Delphi 5, mas o projeto de teste foi compilado na vers\u00e3o mais recente do Delphi sem nenhum problema, como seria de se esperar de uma biblioteca puramente matem\u00e1tica.<\/p>\n<h3>Uso da biblioteca<\/h3>\n<h5>Entradas<\/h5>\n<p>A fun\u00e7\u00e3o principal aceita:<\/p>\n<ul>\n<li>Uma matriz de valores X de ponto flutuante.<\/li>\n<li>Uma matriz de valores Y de ponto flutuante.<\/li>\n<li>O n\u00famero de termos a serem usados.<\/li>\n<\/ul>\n<p>O n\u00famero de termos est\u00e1 relacionado ao grau da f\u00f3rmula polinomial que ser\u00e1 usada.<\/p>\n<p>Um \u00fanico termo equivale a uma linha horizontal em um gr\u00e1fico, por exemplo\u00a0 \u00a0<em>y = 2<\/em><\/p>\n<p>O uso de dois termos equivale a uma linha reta em um gr\u00e1fico, por exemplo \u00a0<em>y = 3x + 2<\/em><\/p>\n<p>O uso de tr\u00eas termos equivale a uma equa\u00e7\u00e3o quadr\u00e1tica, por exemplo, \u00a0<em>y = 4x\u00b2 + 3x + 2<\/em><\/p>\n<h5>Sa\u00eddas<\/h5>\n<p>A fun\u00e7\u00e3o de c\u00e1lculo preencher\u00e1 uma matriz de valores de ponto flutuante que correspondem aos coeficientes da equa\u00e7\u00e3o. Por exemplo, se quisermos usar tr\u00eas termos (uma equa\u00e7\u00e3o quadr\u00e1tica), podemos passar uma matriz de tr\u00eas n\u00fameros de ponto flutuante. No exemplo quadr\u00e1tico acima, os coeficientes seriam 2, 3 e 4, respectivamente. O c\u00e1lculo tamb\u00e9m retorna um coeficiente de correla\u00e7\u00e3o, que nos diz o quanto a curva se correlaciona com os pontos de entrada fornecidos. Quanto mais pr\u00f3ximo de 1 for esse coeficiente, mais preciso ser\u00e1 o ajuste.<\/p>\n<h3>Resultados<\/h3>\n<p>Ao usar a biblioteca, os testes unit\u00e1rios foram escritos usando um conjunto de pontos de teste fornecidos pelo nosso cliente. Os pontos fornecidos eram t\u00edpicos das amostras que seriam usadas na produ\u00e7\u00e3o. Com esses pontos de amostra, a curva mais precisa foi produzida ao chamar a fun\u00e7\u00e3o com seis termos. Isso equivale a uma fun\u00e7\u00e3o polinomial de quinto grau.<\/p>\n<p>Ao usar mais de seis termos, ocasionalmente ocorreram erros de estouro de ponto flutuante, provavelmente porque os coeficientes calculados eram muito pequenos para serem representados em um tipo Double no Delphi. Ao usar menos de seis termos, a rotina ainda calculava uma curva de melhor ajuste, mas \u00e9 claro que o ajuste n\u00e3o era t\u00e3o preciso. Com menos termos, o coeficiente de correla\u00e7\u00e3o foi menor.<\/p>\n<p>Com seis termos, recebemos seis coeficientes de volta na matriz fornecida \u00e0 fun\u00e7\u00e3o.<\/p>\n<p>Quando tivermos os coeficientes, poderemos calcular o valor Y para qualquer valor de X. Para obter a curva desejada, foi calculada uma matriz de 5.000 pontos X uniformemente espa\u00e7ados, delimitados pelos valores X m\u00e1ximo e m\u00ednimo da amostra.<\/p>\n<pre style=\"background: #ffffff; overflow: auto; width: auto; border: solid gray; border-width: .1em .1em .1em .8em; padding: .2em .6em;\">function CalculateY(const X: Double; const Coefficients: TArray&lt;Double&gt;): Double;\r\nbegin\r\n  var yc := 0.0;\r\n  var xc := 1.0;\r\n\r\n  for var i := Low(Coefficients) to High(Coefficients) do\r\n  begin\r\n    yc := yc + Coefficients[i] * xc;\r\n    xc := xc * X;\r\n  end;\r\n\r\n  Result := yc;\r\nend;<\/pre>\n<p>Aqui est\u00e1 uma amostra de alguns dos pontos de entrada:<\/p>\n<p><img decoding=\"async\" class=\"alignnone size-full wp-image-5158\" src=\"https:\/\/gdksoftware.com\/wp-content\/uploads\/2024\/03\/Image1.png\" alt=\"\" width=\"679\" height=\"344\" srcset=\"https:\/\/gdksoftware.com\/wp-content\/uploads\/2024\/03\/Image1.png 679w, https:\/\/gdksoftware.com\/wp-content\/uploads\/2024\/03\/Image1-300x152.png 300w\" sizes=\"(max-width: 679px) 100vw, 679px\" \/><\/p>\n<p>No software, a curva de melhor ajuste resultante \u00e9 calculada e sobreposta aos pontos da seguinte forma:<\/p>\n<p><img decoding=\"async\" class=\"alignnone size-full wp-image-5161\" src=\"https:\/\/gdksoftware.com\/wp-content\/uploads\/2024\/03\/Image2.png\" alt=\"\" width=\"679\" height=\"344\" srcset=\"https:\/\/gdksoftware.com\/wp-content\/uploads\/2024\/03\/Image2.png 679w, https:\/\/gdksoftware.com\/wp-content\/uploads\/2024\/03\/Image2-300x152.png 300w\" sizes=\"(max-width: 679px) 100vw, 679px\" \/><\/p>\n<h3>Implementa\u00e7\u00e3o<\/h3>\n<p>Esta fun\u00e7\u00e3o utiliza um algoritmo de ajuste de curva de m\u00ednimos quadrados usando a <a href=\"https:\/\/pt.wikipedia.org\/wiki\/Elimina%C3%A7%C3%A3o_de_Gauss\">elimina\u00e7\u00e3o de Gauss-Jordan<\/a>.<\/p>\n<p>Esse \u00e9 um algoritmo bem conhecido para encontrar uma curva polinomial de melhor ajuste para um conjunto de pontos.<\/p>\n<h3>Conclus\u00e3o<\/h3>\n<p>Vimos que uma biblioteca matem\u00e1tica originalmente escrita em Turbo Pascal e nas primeiras vers\u00f5es do Delphi pode ser usada nas vers\u00f5es mais recentes do Delphi sem modifica\u00e7\u00f5es.<\/p>\n<p>Essa biblioteca pode produzir curvas precisas e suaves para o melhor ajuste de um conjunto de pontos de dados.<br \/>\nQuanto maior o n\u00famero de termos e, portanto, o grau do polin\u00f4mio, mais preciso ser\u00e1 o ajuste.<\/p>\n","protected":false},"featured_media":0,"parent":0,"template":"","class_list":["post-5165","knowledge","type-knowledge","status-publish","hentry","knowledge-category-arquivo-delphi"],"acf":{"author":2919,"type_hero":"compact","hero_image":5157,"hero_image_position":"","hero_title":"Curva polinomial de melhor ajuste","hero_content":"","hero_link":null,"hero_show_h1":false},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.8 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Curva polinomial de melhor ajuste - GDK Software<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gdksoftware.com\/pt-br\/base-de-conhecimento\/curva-polinomial-de-melhor-ajuste\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Curva polinomial de melhor ajuste\" \/>\n<meta property=\"og:description\" content=\"Contexto Recentemente, um cliente nos solicitou que calcul\u00e1ssemos uma curva de melhor ajuste para um conjunto de pontos. O software que est\u00e1vamos implementando \u00e9 usado para acionar uma m\u00e1quina de usinagem de metais e precisava produzir uma sa\u00edda que fosse uma curva suave, com base em um conjunto de pontos amostrados. Tendo trabalhado em problemas [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gdksoftware.com\/pt-br\/base-de-conhecimento\/curva-polinomial-de-melhor-ajuste\" \/>\n<meta property=\"og:site_name\" content=\"GDK Software\" \/>\n<meta property=\"og:image\" content=\"https:\/\/gdksoftware.com\/wp-content\/uploads\/2024\/03\/Image1.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data1\" content=\"4 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/pt-br\\\/base-de-conhecimento\\\/curva-polinomial-de-melhor-ajuste\",\"url\":\"https:\\\/\\\/gdksoftware.com\\\/pt-br\\\/base-de-conhecimento\\\/curva-polinomial-de-melhor-ajuste\",\"name\":\"Curva polinomial de melhor ajuste - GDK Software\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/pt-br#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/pt-br\\\/base-de-conhecimento\\\/curva-polinomial-de-melhor-ajuste#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/pt-br\\\/base-de-conhecimento\\\/curva-polinomial-de-melhor-ajuste#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gdksoftware.com\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/Image1.png\",\"datePublished\":\"2024-03-21T15:32:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/pt-br\\\/base-de-conhecimento\\\/curva-polinomial-de-melhor-ajuste#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gdksoftware.com\\\/pt-br\\\/base-de-conhecimento\\\/curva-polinomial-de-melhor-ajuste\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/pt-br\\\/base-de-conhecimento\\\/curva-polinomial-de-melhor-ajuste#primaryimage\",\"url\":\"https:\\\/\\\/gdksoftware.com\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/Image1.png\",\"contentUrl\":\"https:\\\/\\\/gdksoftware.com\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/Image1.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/pt-br\\\/base-de-conhecimento\\\/curva-polinomial-de-melhor-ajuste#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gdksoftware.com\\\/pt-br\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Knowledgebase\",\"item\":\"https:\\\/\\\/gdksoftware.com\\\/pt-br\\\/base-de-conhecimento\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Curva polinomial de melhor ajuste\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/pt-br#website\",\"url\":\"https:\\\/\\\/gdksoftware.com\\\/pt-br\",\"name\":\"GDK Software\",\"description\":\"Zet de stip op je horizon\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gdksoftware.com\\\/pt-br?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Curva polinomial de melhor ajuste - GDK Software","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/gdksoftware.com\/pt-br\/base-de-conhecimento\/curva-polinomial-de-melhor-ajuste","og_locale":"pt_BR","og_type":"article","og_title":"Curva polinomial de melhor ajuste","og_description":"Contexto Recentemente, um cliente nos solicitou que calcul\u00e1ssemos uma curva de melhor ajuste para um conjunto de pontos. O software que est\u00e1vamos implementando \u00e9 usado para acionar uma m\u00e1quina de usinagem de metais e precisava produzir uma sa\u00edda que fosse uma curva suave, com base em um conjunto de pontos amostrados. Tendo trabalhado em problemas [&hellip;]","og_url":"https:\/\/gdksoftware.com\/pt-br\/base-de-conhecimento\/curva-polinomial-de-melhor-ajuste","og_site_name":"GDK Software","og_image":[{"url":"https:\/\/gdksoftware.com\/wp-content\/uploads\/2024\/03\/Image1.png","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Est. tempo de leitura":"4 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/gdksoftware.com\/pt-br\/base-de-conhecimento\/curva-polinomial-de-melhor-ajuste","url":"https:\/\/gdksoftware.com\/pt-br\/base-de-conhecimento\/curva-polinomial-de-melhor-ajuste","name":"Curva polinomial de melhor ajuste - GDK Software","isPartOf":{"@id":"https:\/\/gdksoftware.com\/pt-br#website"},"primaryImageOfPage":{"@id":"https:\/\/gdksoftware.com\/pt-br\/base-de-conhecimento\/curva-polinomial-de-melhor-ajuste#primaryimage"},"image":{"@id":"https:\/\/gdksoftware.com\/pt-br\/base-de-conhecimento\/curva-polinomial-de-melhor-ajuste#primaryimage"},"thumbnailUrl":"https:\/\/gdksoftware.com\/wp-content\/uploads\/2024\/03\/Image1.png","datePublished":"2024-03-21T15:32:38+00:00","breadcrumb":{"@id":"https:\/\/gdksoftware.com\/pt-br\/base-de-conhecimento\/curva-polinomial-de-melhor-ajuste#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gdksoftware.com\/pt-br\/base-de-conhecimento\/curva-polinomial-de-melhor-ajuste"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/gdksoftware.com\/pt-br\/base-de-conhecimento\/curva-polinomial-de-melhor-ajuste#primaryimage","url":"https:\/\/gdksoftware.com\/wp-content\/uploads\/2024\/03\/Image1.png","contentUrl":"https:\/\/gdksoftware.com\/wp-content\/uploads\/2024\/03\/Image1.png"},{"@type":"BreadcrumbList","@id":"https:\/\/gdksoftware.com\/pt-br\/base-de-conhecimento\/curva-polinomial-de-melhor-ajuste#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gdksoftware.com\/pt-br"},{"@type":"ListItem","position":2,"name":"Knowledgebase","item":"https:\/\/gdksoftware.com\/pt-br\/base-de-conhecimento"},{"@type":"ListItem","position":3,"name":"Curva polinomial de melhor ajuste"}]},{"@type":"WebSite","@id":"https:\/\/gdksoftware.com\/pt-br#website","url":"https:\/\/gdksoftware.com\/pt-br","name":"GDK Software","description":"Zet de stip op je horizon","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gdksoftware.com\/pt-br?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"}]}},"_links":{"self":[{"href":"https:\/\/gdksoftware.com\/pt-br\/wp-json\/wp\/v2\/knowledge\/5165","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gdksoftware.com\/pt-br\/wp-json\/wp\/v2\/knowledge"}],"about":[{"href":"https:\/\/gdksoftware.com\/pt-br\/wp-json\/wp\/v2\/types\/knowledge"}],"acf:post":[{"embeddable":true,"href":"https:\/\/gdksoftware.com\/pt-br\/wp-json\/wp\/v2\/team\/2919"}],"wp:attachment":[{"href":"https:\/\/gdksoftware.com\/pt-br\/wp-json\/wp\/v2\/media?parent=5165"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}