{"id":11751,"date":"2017-07-09T11:14:00","date_gmt":"2017-07-09T16:14:00","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/analisisnumerico\/?p=11751"},"modified":"2026-03-03T15:45:40","modified_gmt":"2026-03-03T20:45:40","slug":"trazadores-cubicos-frontera-sujeta","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-u04\/trazadores-cubicos-frontera-sujeta\/","title":{"rendered":"4.5.1 Trazadores C\u00fabicos, frontera sujeta con Python"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p>Trazador c\u00fabico frontera sujeta<\/p>\n\n\n\n<p><a href=\"#algoritmo\">Algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#libreria\">librer\u00eda<\/a><br><a name=\"algoritmo\"><\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">1. Algoritmo en Python - Frontera sujeta<\/h2>\n\n\n\n<p>Para el ejercicio anterior, haciendo que la primera derivada sea cero en los extremos&nbsp; y luego de realizar los ajustes al algoritmo, se tiene como resultado:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/07\/spline05fronterasujeta.png\" alt=\"spline frontera sujeta\" class=\"wp-image-13591\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>h: &#091;0.1 0.1 0.1]\nA:\n&#091;&#091;-0.03333333 -0.01666667  0.          0.        ]\n &#091; 0.1         0.4         0.1         0.        ]\n &#091; 0.          0.1         0.4         0.1       ]\n &#091; 0.          0.          0.01666667  0.03333333]]\nB: &#091; -3.5 -27.   24.   -3. ]\nS: &#091; 178. -146.  136. -158.]\ncoeficientes&#091; ,tramo]:\na: &#091;-540.  470. -490.]\nb: &#091; 89. -73.  68.]\nc: &#091;-3.99680289e-15  1.60000000e+00  1.10000000e+00]\nd: &#091;1.45 1.8  1.7 ]\nTrazador c\u00fabico frontera sujeta\nPolinomios por tramos: \nx = &#091; 0.1 , 0.2 ]\nexpresi\u00f3n: -3.99680288865056e-15*x - 540.0*(x - 0.1)**3 + 89.0000000000001*(x - 0.1)**2 + 1.45\nsimplifica:\n         3          2                \n- 540.0\u22c5x  + 251.0\u22c5x  - 34.0\u22c5x + 2.88\nx = &#091; 0.2 , 0.3 ]\nexpresi\u00f3n: 1.6*x + 470.0*(x - 0.2)**3 - 73.0*(x - 0.2)**2 + 1.48\nsimplifica:\n       3          2                                        \n470.0\u22c5x  - 355.0\u22c5x  + 87.2000000000001\u22c5x - 5.20000000000001\nx = &#091; 0.3 , 0.4 ]\nexpresi\u00f3n: 1.1*x - 490.0*(x - 0.3)**3 + 68.0*(x - 0.3)**2 + 1.37\nsimplifica:\n         3          2                  \n- 490.0\u22c5x  + 509.0\u22c5x  - 172.0\u22c5x + 20.72<\/code><\/pre>\n\n\n\n<p>Instrucciones en Python<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Trazador cubico frontera sujeta\nimport numpy as np\nimport sympy as sym\n\n# INGRESO\nxi = &#x5B;0.1 , 0.2, 0.3, 0.4]\nfi = &#x5B;1.45, 1.8, 1.7, 2.0]\n\ntitulo = 'Trazador c\u00fabico frontera sujeta'\n# sujeto,  1ra derivadas en los nodos extremos son conocidas\nd1y0 = 0  # izquierda, xi&#x5B;0]\nd1yn = 0  # derecha, xi&#x5B;n-1]\n\n# Algoritmos como funcion\ndef traza3sujeto(xi,yi,d1y0,dy1n, vertabla=False):\n    ''' trazador cubico sujeto, d1y0=y'(x&#x5B;0]), dyn=y'(x&#x5B;n-1])\n    1ra derivadas en los nodos extremos son conocidas\n    '''\n    # Vectores como arreglo, numeros reales\n    xi = np.array(xi,dtype=float)\n    yi = np.array(yi,dtype=float)\n    n = len(xi)\n    \n    h = np.diff(xi,n=1) # h tamano de paso\n\n    # Sistema de ecuaciones\n    A = np.zeros(shape=(n,n), dtype=float)\n    B = np.zeros(n, dtype=float)\n    S = np.zeros(n-1, dtype=float)\n    A&#x5B;0,0] = -h&#x5B;0]\/3\n    A&#x5B;0,1] = -h&#x5B;0]\/6\n    B&#x5B;0] = d1y0 - (yi&#x5B;1]-yi&#x5B;0])\/h&#x5B;0]\n    for i in range(1,n-1,1):\n        A&#x5B;i,i-1] = h&#x5B;i-1]\n        A&#x5B;i,i] = 2*(h&#x5B;i-1]+h&#x5B;i])\n        A&#x5B;i,i+1] = h&#x5B;i]\n        B&#x5B;i] = 6*((yi&#x5B;i+1]-yi&#x5B;i])\/h&#x5B;i] - (yi&#x5B;i]-yi&#x5B;i-1])\/h&#x5B;i-1])\n    A&#x5B;n-1,n-2] = h&#x5B;n-2]\/6\n    A&#x5B;n-1,n-1] = h&#x5B;n-2]\/3\n    B&#x5B;n-1] = d1yn - (yi&#x5B;n-1]-yi&#x5B;n-2])\/h&#x5B;n-2]\n    \n    # Resolver sistema de ecuaciones, S\n    S = np.linalg.solve(A,B)\n\n    # Coeficientes\n    a = np.zeros(n-1, dtype = float)\n    b = np.zeros(n-1, dtype = float)\n    c = np.zeros(n-1, dtype = float)\n    d = np.zeros(n-1, dtype = float)\n    for j in range(0,n-1,1):\n        a&#x5B;j] = (S&#x5B;j+1]-S&#x5B;j])\/(6*h&#x5B;j])\n        b&#x5B;j] = S&#x5B;j]\/2\n        c&#x5B;j] = (yi&#x5B;j+1]-yi&#x5B;j])\/h&#x5B;j] - (2*h&#x5B;j]*S&#x5B;j]+h&#x5B;j]*S&#x5B;j+1])\/6\n        d&#x5B;j] = yi&#x5B;j]\n\n    # Polinomio trazador\n    x = sym.Symbol('x')\n    px_tabla = &#x5B;]\n    for j in range(0,n-1,1):\n        pxtramo = a&#x5B;j]*(x-xi&#x5B;j])**3 + b&#x5B;j]*(x-xi&#x5B;j])**2 + c&#x5B;j]*(x-xi&#x5B;j])+ d&#x5B;j]\n        px_tabla.append(pxtramo)\n    \n    if vertabla==True:\n        print('h:',h)\n        print('A:') ; print(A)\n        print('B:',B) ; print('S:',S)\n        print('coeficientes&#x5B; ,tramo]:')\n        print('a:',a) ; print('b:',b)\n        print('c:',c) ; print('d:',d)\n\n    return(px_tabla)\n\n# PROGRAMA ---------------\n# PROCEDIMIENTO\nn = len(xi)\n# Obtiene los polinomios por tramos\npx_tabla = traza3sujeto(xi,fi,d1y0,d1yn,vertabla=True)\n\n# SALIDA\nprint(titulo)\nprint('Polinomios por tramos: ')\nfor i in range(0,n-1,1):\n    print('x = &#x5B;',xi&#x5B;i],',',xi&#x5B;i+1],']')\n    print('expresi\u00f3n:',px_tabla&#x5B;i])\n    print('simplifica:')\n    sym.pprint(px_tabla&#x5B;i].expand())\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p>Trazador c\u00fabico frontera sujeta<\/p>\n\n\n\n<p><a href=\"#algoritmo\">Algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#libreria\">librer\u00eda<\/a><br><a name=\"algoritmo\"><\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"grafica\">2. Gr\u00e1fica en Python<\/h2>\n\n\n\n<p>La gr\u00e1fica se realiza en un bloque con los resultados del algoritmo<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# GRAFICA --------------\nimport matplotlib.pyplot as plt\n\nmuestras = 10 # entre cada par de puntos\n\n# Puntos para grafica en cada tramo\nxtraza = np.array(&#x5B;],dtype=float)\nytraza = np.array(&#x5B;],dtype=float)\ni = 0\nwhile i&lt;n-1: # cada tramo\n    xtramo = np.linspace(xi&#x5B;i],xi&#x5B;i+1],muestras)\n    # evalua polinomio del tramo\n    pxk = sym.lambdify('x',px_tabla&#x5B;i])\n    ytramo = pxk(xtramo)\n    # vectores de trazador en x,y\n    xtraza = np.concatenate((xtraza,xtramo))\n    ytraza = np.concatenate((ytraza,ytramo))\n    i = i + 1\n\n# Graficar\nplt.plot(xtraza,ytraza, label='trazador')\nplt.plot(xi,fi,'o', label='puntos')\nplt.title(titulo)\nplt.xlabel('xi')\nplt.ylabel('px(xi)')\nplt.legend()\nplt.show()\nplt.show()\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p>Trazador c\u00fabico frontera sujeta<\/p>\n\n\n\n<p><a href=\"#algoritmo\">Algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#libreria\">librer\u00eda<\/a><br><a name=\"algoritmo\"><\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"libreria\">3. Trazador c\u00fabico sujeto en librer\u00eda Scipy.interpolate.CubicSpline<\/h2>\n\n\n\n<p>Tambi\u00e9n es posible usar la funci\u00f3n de Scipy para generar los trazadores c\u00fabicos en el caso de frontera sujeta. Se hacen los ajustes en el bloque de ingreso, considerando que las primeras&nbsp;derivadas en los nodos extremos son conocidas.<\/p>\n\n\n\n<p>El resultado del algoritmo se presenta como<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>Trazador c\u00fabico frontera sujeta\ncoeficientes:\na: &#091;-540.  470. -490.]\nb: &#091; 89. -73.  68.]\nc: &#091;0.  1.6 1.1]\nd: &#091;1.45 1.8  1.7 ]\nPolinomios por tramos: \nx = &#091; 0.1 , 0.2 ]\nexpresi\u00f3n: -540.0*(x - 0.1)**3 + 89.0*(x - 0.1)**2 + 1.45\nsimplifica:\n         3          2                \n- 540.0\u22c5x  + 251.0\u22c5x  - 34.0\u22c5x + 2.88\nx = &#091; 0.2 , 0.3 ]\nexpresi\u00f3n: 1.6*x + 470.0*(x - 0.2)**3 - 73.0*(x - 0.2)**2 + 1.48\nsimplifica:\n       3          2                           \n470.0\u22c5x  - 355.0\u22c5x  + 87.2000000000001\u22c5x - 5.2\nx = &#091; 0.3 , 0.4 ]\nexpresi\u00f3n: 1.1*x - 490.0*(x - 0.3)**3 + 68.0*(x - 0.3)**2 + 1.37\nsimplifica:\n         3          2                  \n- 490.0\u22c5x  + 509.0\u22c5x  - 172.0\u22c5x + 20.72<\/code><\/pre>\n\n\n\n<p>Instrucciones en Python con la librer\u00eda Scipy para trazadores c\u00fabicos con frontera sujeta.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Trazador c\u00fabico frontera sujeta con Scipy\nimport numpy as np\nimport scipy as sp\nimport sympy as sym\n\n# INGRESO\nxi = &#x5B;0.1 , 0.2, 0.3, 0.4]\nfi = &#x5B;1.45, 1.8, 1.7, 2.0]\n\ntitulo = 'Trazador c\u00fabico frontera sujeta'\n# sujeto,  1ra derivadas en los nodos extremos son conocidas\nd1y0 = 0  # izquierda, xi&#x5B;0]\nd1yn = 0  # derecha, xi&#x5B;n-1]\ncs_tipo = ((1, d1y0), (1, d1yn)) # sujeto\n\n# PROCEDIMIENTO\n# Vectores como arreglo, numeros reales\nxi = np.array(xi,dtype=float)\nfi = np.array(fi,dtype=float)\nn = len(xi)\n\n# coeficientes de trazadores c\u00fabicos\ntraza_cub = sp.interpolate.CubicSpline(xi,fi,bc_type=cs_tipo )\ntraza_coef = traza_cub.c # coeficientes\na = traza_coef&#x5B;0]\nb = traza_coef&#x5B;1]\nc = traza_coef&#x5B;2]\nd = traza_coef&#x5B;3]\n\n# Polinomio trazador\nx = sym.Symbol('x')\npx_tabla = &#x5B;]\nfor j in range(0,n-1,1):\n    pxtramo = a&#x5B;j]*(x-xi&#x5B;j])**3 + b&#x5B;j]*(x-xi&#x5B;j])**2 + c&#x5B;j]*(x-xi&#x5B;j])+ d&#x5B;j]\n    px_tabla.append(pxtramo)\n\n# SALIDA\nprint(titulo)\nprint('coeficientes:')\nprint('a:',a)\nprint('b:',b)\nprint('c:',c)\nprint('d:',d)\nprint('Polinomios por tramos: ')\nfor i in range(0,n-1,1):\n    print('x = &#x5B;',xi&#x5B;i],',',xi&#x5B;i+1],']')\n    print('expresi\u00f3n:',px_tabla&#x5B;i])\n    print('simplifica:')\n    sym.pprint(px_tabla&#x5B;i].expand())\n<\/pre><\/div>\n\n\n<p>La gr\u00e1fica se puede realizar con el bloque presentado para el algoritmo anterior. <\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p>Trazador c\u00fabico frontera sujeta<\/p>\n\n\n\n<p><a href=\"#algoritmo\">Algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#libreria\">librer\u00eda<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n","protected":false},"excerpt":{"rendered":"<p>Trazador c\u00fabico frontera sujeta Algoritmo gr\u00e1fica librer\u00eda 1. Algoritmo en Python - Frontera sujeta Para el ejercicio anterior, haciendo que la primera derivada sea cero en los extremos&nbsp; y luego de realizar los ajustes al algoritmo, se tiene como resultado: Instrucciones en Python Trazador c\u00fabico frontera sujeta Algoritmo gr\u00e1fica librer\u00eda 2. Gr\u00e1fica en Python La [&hellip;]<\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"wp-custom-template-entrada-mn-unidades","format":"standard","meta":{"footnotes":""},"categories":[38],"tags":[],"class_list":["post-11751","post","type-post","status-publish","format-standard","hentry","category-mn-u04"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/11751","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/users\/8043"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/comments?post=11751"}],"version-history":[{"count":12,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/11751\/revisions"}],"predecessor-version":[{"id":22396,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/11751\/revisions\/22396"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=11751"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=11751"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=11751"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}