{"id":8350,"date":"2023-12-04T06:00:24","date_gmt":"2023-12-04T04:00:24","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=8350"},"modified":"2024-05-17T18:41:41","modified_gmt":"2024-05-17T16:41:41","slug":"04-dic-23","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/04-dic-23\/","title":{"rendered":"Algoritmo de bajada para resolver un sistema triangular inferior"},"content":{"rendered":"\n<p>Un sistema de ecuaciones lineales &#92;(Ax = b&#92;) es triangular inferior si todos los elementos de la matriz &#92;(A&#92;) que est\u00e1n por encima de la diagonal principal son nulos; es decir, es de la forma<br \/>\n&#92;begin{align}<br \/>\n   &amp;a_{1 1}x_1                                            &amp;= b_1 &#92;&#92;<br \/>\n   &amp;a_{2 1}x_1 + a_{2 2}x_2                               &amp;= b_2 &#92;&#92;<br \/>\n   &amp;a_{3 1}x_1 + a_{3 2}x_2 + a_{3 3}x_3                  &amp;= b_3 &#92;&#92;<br \/>\n   &amp;&#8230;                                                   &amp;      &#92;&#92;<br \/>\n   &amp;a_{n 1}x_1 + a_{n 2}x_2 + a_{n 3}x_3 +&#8230;+ a_{n n}x_n &amp;= b_n<br \/>\n&#92;end{align}<\/p>\n<p>El sistema es compatible si, y s\u00f3lo si, el producto de los elementos de la diagonal principal es distinto de cero. En este caso, la soluci\u00f3n se puede calcular mediante el algoritmo de bajada:<br \/>\n&#92;begin{align}<br \/>\n   x_1 &amp;= &#92;frac{b_1}{a_{1 1}} &#92;&#92;<br \/>\n   x_2 &amp;= &#92;frac{b_2 &#8211; a_{2 1}x_1}{a_{2 2}} &#92;&#92;<br \/>\n   x_3 &amp;= &#92;frac{b_3 &#8211; a_{3 1}x_1 &#8211; a_{3 2}x_2}{a_{3 3}} &#92;&#92;<br \/>\n   &#8230; &#92;&#92;<br \/>\n   x_n &amp;= &#92;frac{b_n &#8211; a_{n 1}x_1 &#8211; a_{n 2}x_2 &#8211; &#8230; &#8211; a_{n,n-1}x_{n-1}}{a_{n n}}<br \/>\n&#92;end{align}<\/p>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   bajada :: Matrix Double -> Matrix Double -> Matrix Double\n<\/pre>\n<p>tal que <code>bajada a b<\/code> es la soluci\u00f3n, mediante el algoritmo de bajada, del sistema compatible triangular superior <code>ax = b<\/code>. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   \u03bb> let a = fromLists [[2,0,0],[3,1,0],[4,2,5.0]]\n   \u03bb> let b = fromLists [[3],[6.5],[10]]\n   \u03bb> bajada a b\n   ( 1.5 )\n   ( 2.0 )\n   ( 0.0 )\n<\/pre>\n<p>Es decir, la soluci\u00f3n del sistema<br \/>\n&#92;begin{align}<br \/>\n   2x           &amp;= 3   &#92;&#92;<br \/>\n   3x + y       &amp;= 6.5 &#92;&#92;<br \/>\n   4x + 2y + 5z &amp;= 10<br \/>\n&#92;end{align}<br \/>\nes &#92;(x=1.5&#92;), &#92;(y=2&#92;) y &#92;(z=0&#92;).<br \/>\n<!--more--><\/p>\n<p><b>Soluciones<\/b><\/p>\n<p>A continuaci\u00f3n se muestran las <a href=\"#haskell\">soluciones en Haskell<\/a> y las <a href=\"#python\">soluciones en Python<\/a>.<\/p>\n<p><a name=\"haskell\"><\/a><br \/>\n<b>Soluciones en Haskell<\/b><\/p>\n<pre lang=\"haskell\">\nmodule Algoritmo_de_bajada where\n\nimport Data.Matrix (Matrix, (!), fromLists, nrows, toLists)\nimport Test.Hspec (Spec, hspec, it, shouldBe)\n\nbajada :: Matrix Double -> Matrix Double -> Matrix Double\nbajada a b = fromLists [[x i] | i <- [1..m]]\n  where m   = nrows a\n        x k = (b!(k,1) - sum [a!(k,j) * x j | j <- [1..k-1]]) \/ a!(k,k)\n\n-- Verificaci\u00f3n\n-- ============\n\nverifica :: IO ()\nverifica = hspec spec\n\nspec :: Spec\nspec = do\n  it \"ej1\" $\n    toLists (bajada a b) `shouldBe` [[1.5],[2.0],[0.0]]\n    where\n      a = fromLists [[2,0,0],[3,1,0],[4,2,5.0]]\n      b = fromLists [[3],[6.5],[10]]\n\n-- La verificaci\u00f3n es\n--    \u03bb> verifica\n--\n--    Finished in 0.0007 seconds\n--    1 example, 0 failures\n<\/pre>\n<p><a name=\"python\"><\/a><br \/>\n<b>Soluciones en Python<\/b><\/p>\n<pre lang=\"python\">\ndef bajada(a: list[list[float]], b: list[list[float]]) -> list[list[float]]:\n    n = len(a)\n    def x(k: int) -> float:\n        return (b[k][0] - sum((a[k][j] * x(j) for j in range(0, k)))) \/ a[k][k]\n    return [[x(i)] for i in range(0, n)]\n\n# Verificaci\u00f3n\n# ============\n\ndef test_bajada() -> None:\n    assert bajada([[2,0,0],[3,1,0],[4,2,5.0]], [[3],[6.5],[10]]) == \\\n        [[1.5], [2.0], [0.0]]\n    print(\"Verificado\")\n\n# La verificaci\u00f3n es\n#    >>> test_bajada()\n#    Verificado\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Un sistema de ecuaciones lineales &#92;(Ax = b&#92;) es triangular inferior si todos los elementos de la matriz &#92;(A&#92;) que est\u00e1n por encima de la diagonal principal son nulos; es decir, es de la forma &#92;begin{align} &amp;a_{1 1}x_1 &amp;= b_1 &#92;&#92; &amp;a_{2 1}x_1 + a_{2 2}x_2 &amp;= b_2 &#92;&#92; &amp;a_{3 1}x_1 + a_{3 2}x_2 +&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_kad_post_transparent":"default","_kad_post_title":"default","_kad_post_layout":"default","_kad_post_sidebar_id":"","_kad_post_content_style":"default","_kad_post_vertical_padding":"default","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false},"categories":[581],"tags":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/8350"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/comments?post=8350"}],"version-history":[{"count":4,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/8350\/revisions"}],"predecessor-version":[{"id":8569,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/8350\/revisions\/8569"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=8350"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=8350"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=8350"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}