{ "cells": [ { "cell_type": "markdown", "id": "b0171fe2", "metadata": { "id": "6e-MGk_sYwto", "papermill": { "duration": 0.005395, "end_time": "2025-05-26T12:00:42.929552", "exception": false, "start_time": "2025-05-26T12:00:42.924157", "status": "completed" }, "tags": [] }, "source": [ "# Лабораторная работа №4. LU-разложение" ] }, { "cell_type": "code", "execution_count": 1, "id": "e55ed6ed", "metadata": { "execution": { "iopub.execute_input": "2025-05-26T12:00:42.939088Z", "iopub.status.busy": "2025-05-26T12:00:42.938689Z", "iopub.status.idle": "2025-05-26T12:00:42.948722Z", "shell.execute_reply": "2025-05-26T12:00:42.947046Z" }, "id": "gsnd8FCUYwtq", "papermill": { "duration": 0.016723, "end_time": "2025-05-26T12:00:42.950660", "exception": false, "start_time": "2025-05-26T12:00:42.933937", "status": "completed" }, "tags": [] }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "id": "c9cdfebd", "metadata": { "id": "TqOkW3yn6CfL", "papermill": { "duration": 0.003345, "end_time": "2025-05-26T12:00:42.958714", "exception": false, "start_time": "2025-05-26T12:00:42.955369", "status": "completed" }, "tags": [] }, "source": [ "## Исходные СЛАУ" ] }, { "cell_type": "markdown", "id": "edde8bd8", "metadata": { "id": "eaWRRTBS6Ht-", "papermill": { "duration": 0.003509, "end_time": "2025-05-26T12:00:42.966538", "exception": false, "start_time": "2025-05-26T12:00:42.963029", "status": "completed" }, "tags": [] }, "source": [ "$A_1x = b_1$:\n", "\\begin{equation}\n", "\t\\begin{bmatrix}\n", "\t\t1 & 1 & 0 & 3 \\\\\n", "\t\t2 & 1 & -1 & 1 \\\\\n", "\t\t3 & -1 & -1 & 2 \\\\\n", "\t\t-1 & 2 & 3 & -1\n", "\t\\end{bmatrix}\n", "\t\\begin{bmatrix}\n", "\t\tx_1 \\\\\n", "\t\tx_2 \\\\\n", "\t\tx_3 \\\\\n", "\t\tx_4\n", "\t\\end{bmatrix}\n", "\t=\n", "\t\\begin{bmatrix}\n", "\t\t4 \\\\\n", "\t\t1 \\\\\n", "\t\t-3 \\\\\n", "\t\t4\n", "\t\\end{bmatrix}\n", "\\end{equation}\n", "\n", "$A_2x = b_2$:\n", "\\begin{equation}\n", "\t\\begin{bmatrix}\n", "\t\t3 & 1 & -3 \\\\\n", "\t\t6 & 2 & 5 \\\\\n", "\t\t1 & 4 & -3\n", "\t\\end{bmatrix}\n", "\t\\begin{bmatrix}\n", "\t\tx_1 \\\\\n", "\t\tx_2 \\\\\n", "\t\tx_3\n", "\t\\end{bmatrix}\n", "\t=\n", "\t\\begin{bmatrix}\n", "\t\t-16 \\\\\n", "\t\t12 \\\\\n", "\t\t-39\n", "\t\\end{bmatrix}\n", "\\end{equation}" ] }, { "cell_type": "markdown", "id": "4e2397fc", "metadata": { "id": "4RjiYoOFYwtq", "papermill": { "duration": 0.00338, "end_time": "2025-05-26T12:00:42.974269", "exception": false, "start_time": "2025-05-26T12:00:42.970889", "status": "completed" }, "tags": [] }, "source": [ "## LU-разложение" ] }, { "cell_type": "code", "execution_count": 2, "id": "00dfff6f", "metadata": { "execution": { "iopub.execute_input": "2025-05-26T12:00:42.984367Z", "iopub.status.busy": "2025-05-26T12:00:42.984067Z", "iopub.status.idle": "2025-05-26T12:00:42.990634Z", "shell.execute_reply": "2025-05-26T12:00:42.989637Z" }, "id": "80D9G2G0Ywtr", "papermill": { "duration": 0.014196, "end_time": "2025-05-26T12:00:42.993087", "exception": false, "start_time": "2025-05-26T12:00:42.978891", "status": "completed" }, "tags": [] }, "outputs": [], "source": [ "def lu(A):\n", " n = A.shape[0]\n", " U = A.copy()\n", " L = np.eye(n)\n", " for i in range(n):\n", " M = np.eye(n)\n", "\n", " for j in range(i+1, n):\n", " m_i = U[j, i] / U[i, i]\n", " M[j, i] = -m_i\n", "\n", " U = M @ U\n", " L = L @ np.linalg.inv(M)\n", " return L, U" ] }, { "cell_type": "markdown", "id": "6ec9cd52", "metadata": { "id": "-xXPAM5kYwts", "papermill": { "duration": 0.004751, "end_time": "2025-05-26T12:00:43.002932", "exception": false, "start_time": "2025-05-26T12:00:42.998181", "status": "completed" }, "tags": [] }, "source": [ "## Решение СЛАУ с использованием LU-разложения" ] }, { "cell_type": "code", "execution_count": 3, "id": "a4fa7355", "metadata": { "execution": { "iopub.execute_input": "2025-05-26T12:00:43.011657Z", "iopub.status.busy": "2025-05-26T12:00:43.011325Z", "iopub.status.idle": "2025-05-26T12:00:43.017980Z", "shell.execute_reply": "2025-05-26T12:00:43.016791Z" }, "id": "I6zZuT9zYwts", "papermill": { "duration": 0.01353, "end_time": "2025-05-26T12:00:43.020024", "exception": false, "start_time": "2025-05-26T12:00:43.006494", "status": "completed" }, "tags": [] }, "outputs": [], "source": [ "def solve(L, U, b):\n", " n = L.shape[0]\n", " y = np.zeros(n)\n", " for i in range(n):\n", " y[i] = b[i] - np.dot(L[i, :i], y[:i])\n", "\n", " x = np.zeros(n)\n", " for i in range(n-1, -1, -1):\n", " x[i] = (y[i] - np.dot(U[i, i+1:], x[i+1:])) / U[i, i]\n", " return x" ] }, { "cell_type": "markdown", "id": "144e122d", "metadata": { "id": "zMPnLeRL6tkA", "papermill": { "duration": 0.003144, "end_time": "2025-05-26T12:00:43.026992", "exception": false, "start_time": "2025-05-26T12:00:43.023848", "status": "completed" }, "tags": [] }, "source": [ "## Решение СЛАУ $A_1x = b_1$" ] }, { "cell_type": "code", "execution_count": 4, "id": "11241f71", "metadata": { "_cell_guid": "b1076dfc-b9ad-4769-8c92-a6c4dae69d19", "_uuid": "8f2839f25d086af736a60e9eeb907d3b93b6e0e5", "execution": { "iopub.execute_input": "2025-05-26T12:00:43.036794Z", "iopub.status.busy": "2025-05-26T12:00:43.036450Z", "iopub.status.idle": "2025-05-26T12:00:43.136912Z", "shell.execute_reply": "2025-05-26T12:00:43.135576Z" }, "id": "dbxDrIfqYwts", "outputId": "eedc32fe-e354-4603-947a-37d0e57394fe", "papermill": { "duration": 0.108266, "end_time": "2025-05-26T12:00:43.138788", "exception": false, "start_time": "2025-05-26T12:00:43.030522", "status": "completed" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Solve is: [ -1.000000, 2.000000, 0.000000, 1.000000 ]\n" ] } ], "source": [ "A1 = np.array([[1., 1., 0., 3.],\n", " [2., 1., -1., 1.],\n", " [3., -1., -1., 2.],\n", " [-1., 2., 3., -1.]])\n", "b1 = np.array([4., 1., -3., 4.])\n", "\n", "L, U = lu(A1)\n", "# print(\"L:\\n\", L)\n", "# print(\"U:\\n\", U)\n", "ans_1 = solve(L, U, b1)\n", "print(f\"Solve is: [ {ans_1[0]:.6f}, {ans_1[1]:.6f}, {ans_1[2]:.6f}, {ans_1[3]:.6f} ]\")" ] }, { "cell_type": "markdown", "id": "e6479df1", "metadata": { "id": "Zp1o80eLYwtt", "papermill": { "duration": 0.003615, "end_time": "2025-05-26T12:00:43.146164", "exception": false, "start_time": "2025-05-26T12:00:43.142549", "status": "completed" }, "tags": [] }, "source": [ "## Модифицированная функция LU-разложения" ] }, { "cell_type": "code", "execution_count": 5, "id": "54c475c9", "metadata": { "execution": { "iopub.execute_input": "2025-05-26T12:00:43.155575Z", "iopub.status.busy": "2025-05-26T12:00:43.154704Z", "iopub.status.idle": "2025-05-26T12:00:43.163273Z", "shell.execute_reply": "2025-05-26T12:00:43.162006Z" }, "id": "ilUYjY2uYwtt", "papermill": { "duration": 0.01488, "end_time": "2025-05-26T12:00:43.165046", "exception": false, "start_time": "2025-05-26T12:00:43.150166", "status": "completed" }, "tags": [] }, "outputs": [], "source": [ "def lu(A, Permute):\n", " n = A.shape[0]\n", " U = A.copy()\n", " L = np.eye(n)\n", " P = np.eye(n)\n", "\n", " for i in range(n):\n", " if Permute:\n", " max_idx = np.argmax(np.abs(U[i:, i])) + i\n", " if max_idx != i:\n", " U[[i, max_idx], :] = U[[max_idx, i], :]\n", " P[[i, max_idx], :] = P[[max_idx, i], :]\n", " if i > 0:\n", " L[[i, max_idx], :i] = L[[max_idx, i], :i]\n", "\n", " M = np.eye(n)\n", " for j in range(i+1, n):\n", " m_i = U[j,i] / U[i,i]\n", " M[j, i] = -m_i\n", "\n", " U = M @ U\n", " L = L @ np.linalg.inv(M)\n", "\n", " return L, U, P" ] }, { "cell_type": "markdown", "id": "a7df72b9", "metadata": { "id": "NqXdkl5fYwtu", "papermill": { "duration": 0.003428, "end_time": "2025-05-26T12:00:43.172590", "exception": false, "start_time": "2025-05-26T12:00:43.169162", "status": "completed" }, "tags": [] }, "source": [ "## Модифицированная функция решения СЛАУ" ] }, { "cell_type": "code", "execution_count": 6, "id": "eb7d00ab", "metadata": { "execution": { "iopub.execute_input": "2025-05-26T12:00:43.181226Z", "iopub.status.busy": "2025-05-26T12:00:43.180948Z", "iopub.status.idle": "2025-05-26T12:00:43.188210Z", "shell.execute_reply": "2025-05-26T12:00:43.187079Z" }, "id": "_XJZmPHqYwtu", "papermill": { "duration": 0.013904, "end_time": "2025-05-26T12:00:43.190207", "exception": false, "start_time": "2025-05-26T12:00:43.176303", "status": "completed" }, "tags": [] }, "outputs": [], "source": [ "def solve(L, U, P, b):\n", " b = P @ b\n", " n = L.shape[0]\n", " y = np.zeros(n)\n", " for i in range(n):\n", " y[i] = b[i] - np.dot(L[i, :i], y[:i])\n", "\n", " x = np.zeros(n)\n", " for i in range(n-1, -1, -1):\n", " x[i] = (y[i] - np.dot(U[i, i+1:], x[i+1:])) / U[i, i]\n", " return x" ] }, { "cell_type": "markdown", "id": "abb5725d", "metadata": { "id": "4wPzZedyYwtu", "papermill": { "duration": 0.003396, "end_time": "2025-05-26T12:00:43.197774", "exception": false, "start_time": "2025-05-26T12:00:43.194378", "status": "completed" }, "tags": [] }, "source": [ "## Решение СЛАУ $A_2x = b_2$" ] }, { "cell_type": "code", "execution_count": 7, "id": "a03aaca6", "metadata": { "execution": { "iopub.execute_input": "2025-05-26T12:00:43.207494Z", "iopub.status.busy": "2025-05-26T12:00:43.207184Z", "iopub.status.idle": "2025-05-26T12:00:43.215774Z", "shell.execute_reply": "2025-05-26T12:00:43.214371Z" }, "id": "UGd1L6_uYwtv", "outputId": "9c43ee6a-7ad5-4561-90fd-6058c4f55505", "papermill": { "duration": 0.015323, "end_time": "2025-05-26T12:00:43.217345", "exception": false, "start_time": "2025-05-26T12:00:43.202022", "status": "completed" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Solve is: [ 1.000000, -7.000000, 4.000000 ]\n" ] } ], "source": [ "A2 = np.array([[3., 1., -3.], [6., 2., 5.], [1., 4., -3.]])\n", "b2 = np.array([-16., 12., -39.])\n", "L, U, P = lu(A2, True)\n", "# print(\"L:\\n\", L)\n", "# print(\"U:\\n\", U)\n", "# print(\"P:\\n\", P)\n", "ans_2 = solve(L,U,P,b2)\n", "print(f\"Solve is: [ {ans_2[0]:.6f}, {ans_2[1]:.6f}, {ans_2[2]:.6f} ]\")" ] }, { "cell_type": "markdown", "id": "dec771fa", "metadata": { "id": "kzQVvJK-Ywtv", "papermill": { "duration": 0.005275, "end_time": "2025-05-26T12:00:43.226907", "exception": false, "start_time": "2025-05-26T12:00:43.221632", "status": "completed" }, "tags": [] }, "source": [ "## Log-log график относительной погрешности $E = \\frac{\\|\\hat{x} - \\tilde{x}\\|_\\infty}{\\|\\hat{x}\\|_\\infty}$" ] }, { "cell_type": "code", "execution_count": 8, "id": "4e11a9a1", "metadata": { "execution": { "iopub.execute_input": "2025-05-26T12:00:43.237058Z", "iopub.status.busy": "2025-05-26T12:00:43.236762Z", "iopub.status.idle": "2025-05-26T12:00:43.259392Z", "shell.execute_reply": "2025-05-26T12:00:43.257833Z" }, "id": "SUIa1a90Ywtv", "outputId": "18ace28c-a8d9-4ae8-b1f7-0fdb5b5cf313", "papermill": { "duration": 0.031268, "end_time": "2025-05-26T12:00:43.262442", "exception": false, "start_time": "2025-05-26T12:00:43.231174", "status": "completed" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Solve for FALSE, when p = 0, is: 1.000000, -7.000000, 4.000000\n", "Solve for FALSE, when p = 1, is: 1.000000, -7.000000, 4.000000\n", "Solve for FALSE, when p = 2, is: 1.000000, -7.000000, 4.000000\n", "Solve for FALSE, when p = 3, is: 1.000000, -7.000000, 4.000000\n", "Solve for FALSE, when p = 4, is: 1.000000, -7.000000, 4.000000\n", "Solve for FALSE, when p = 5, is: 1.000000, -7.000000, 4.000000\n", "Solve for FALSE, when p = 6, is: 1.000000, -7.000000, 4.000000\n", "Solve for FALSE, when p = 7, is: 1.000000, -7.000000, 4.000000\n", "Solve for FALSE, when p = 8, is: 1.000000, -7.000001, 4.000000\n", "Solve for FALSE, when p = 9, is: 1.000000, -7.000000, 4.000000\n", "Solve for FALSE, when p = 10, is: 0.999982, -6.999947, 4.000000\n", "Solve for FALSE, when p = 11, is: 1.000089, -7.000266, 4.000000\n", "Solve for FALSE, when p = 12, is: 1.000333, -7.000999, 4.000000\n", "\n", "Solve for TRUE, when p = 0, is: 1.000000, -7.000000, 4.000000\n", "Solve for TRUE, when p = 1, is: 1.000000, -7.000000, 4.000000\n", "Solve for TRUE, when p = 2, is: 1.000000, -7.000000, 4.000000\n", "Solve for TRUE, when p = 3, is: 1.000000, -7.000000, 4.000000\n", "Solve for TRUE, when p = 4, is: 1.000000, -7.000000, 4.000000\n", "Solve for TRUE, when p = 5, is: 1.000000, -7.000000, 4.000000\n", "Solve for TRUE, when p = 6, is: 1.000000, -7.000000, 4.000000\n", "Solve for TRUE, when p = 7, is: 1.000000, -7.000000, 4.000000\n", "Solve for TRUE, when p = 8, is: 1.000000, -7.000000, 4.000000\n", "Solve for TRUE, when p = 9, is: 1.000000, -7.000000, 4.000000\n", "Solve for TRUE, when p = 10, is: 1.000000, -7.000000, 4.000000\n", "Solve for TRUE, when p = 11, is: 1.000000, -7.000000, 4.000000\n", "Solve for TRUE, when p = 12, is: 1.000000, -7.000000, 4.000000\n" ] } ], "source": [ "relative_errors_false = []\n", "relative_errors_true = []\n", "for p in range(0, 13):\n", " k = 10**(-p)\n", " A1 = np.array([[3 + k, 1., -3.], [6., 2., 5.], [1., 4., -3.]])\n", " b1 = np.array([-16 + k, 12., -39.])\n", "\n", " L = np.eye(len(A1))\n", " L,U,P = lu(A1, False)\n", " x = solve(L,U,P,b1)\n", " print(f\"Solve for FALSE, when p = {p}, is: {x[0]:.6f}, {x[1]:.6f}, {x[2]:.6f}\")\n", " error = np.linalg.norm(ans_2 - x) / np.linalg.norm(ans_2)\n", " relative_errors_false.append(error)\n", "\n", "print()\n", "for p in range(0, 13):\n", " k = 10**(-p)\n", " A1 = np.array([[3 + k, 1., -3.], [6., 2., 5.], [1., 4., -3.]])\n", " b1 = np.array([-16 + k, 12., -39.])\n", "\n", " L = np.eye(len(A1))\n", " L,U,P = lu(A1, True)\n", " x = solve(L,U,P,b1)\n", " print(f\"Solve for TRUE, when p = {p}, is: {x[0]:.6f}, {x[1]:.6f}, {x[2]:.6f}\")\n", " error = np.linalg.norm(ans_2 - x) / np.linalg.norm(ans_2)\n", " relative_errors_true.append(error)" ] }, { "cell_type": "code", "execution_count": 9, "id": "f1eeafa4", "metadata": { "execution": { "iopub.execute_input": "2025-05-26T12:00:43.273202Z", "iopub.status.busy": "2025-05-26T12:00:43.272878Z", "iopub.status.idle": "2025-05-26T12:00:44.298708Z", "shell.execute_reply": "2025-05-26T12:00:44.297579Z" }, "id": "pBjDPqvyYwtv", "outputId": "310fd01f-5f13-4a67-ca26-8e64d81f86d1", "papermill": { "duration": 1.032378, "end_time": "2025-05-26T12:00:44.300492", "exception": false, "start_time": "2025-05-26T12:00:43.268114", "status": "completed" }, "tags": [] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(8, 5))\n", "plt.loglog(range(0,13), relative_errors_false, 's', color=\"green\", label=r'$\\frac{||\\hat{x} - \\tilde{x}||_{\\infty}}{||\\hat{x}||_{\\infty}}$, False')\n", "plt.loglog(range(0,13), relative_errors_true, 'o', color=\"red\", label=r'$\\frac{||\\hat{x} - \\tilde{x}||_{\\infty}}{||\\hat{x}||_{\\infty}}$, True')\n", "plt.xlabel('$p$')\n", "plt.ylabel(\"$E$\")\n", "plt.grid(True)\n", "fig.tight_layout()\n", "plt.savefig('E.png',dpi=350)\n", "plt.show()" ] } ], "metadata": { "colab": { "collapsed_sections": [ "HHs70jNEYwtv" ], "provenance": [] }, "kaggle": { "accelerator": "none", "dataSources": [], "dockerImageVersionId": 31040, "isGpuEnabled": false, "isInternetEnabled": true, "language": "python", "sourceType": "notebook" }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.11" }, "papermill": { "default_parameters": {}, "duration": 7.337637, "end_time": "2025-05-26T12:00:44.825729", "environment_variables": {}, "exception": null, "input_path": "__notebook__.ipynb", "output_path": "__notebook__.ipynb", "parameters": {}, "start_time": "2025-05-26T12:00:37.488092", "version": "2.6.0" } }, "nbformat": 4, "nbformat_minor": 5 }