Files
educmm_labs/educmm-lab4.ipynb
2025-08-31 18:41:52 +02:00

681 lines
33 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"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": [
"<Figure size 800x500 with 1 Axes>"
]
},
"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
}