mirror of
https://github.com/fverdugo/XM_40017.git
synced 2025-11-08 23:34:24 +01:00
164 lines
3.6 KiB
Plaintext
164 lines
3.6 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "599913a3",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Solving Linear Equations\n",
|
|
"\n",
|
|
"## Serial Algorithm\n",
|
|
"First, we construct a linear equations system $Ax=b$."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "fe3b5b02",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"n = 5\n",
|
|
"A = rand(-10.0:10.0, (n, n))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "57c912fb",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"x = rand(-10.0:10.0, n)\n",
|
|
"b = A * x"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "4baa0681",
|
|
"metadata": {},
|
|
"source": [
|
|
"The code in the following cell converts the problem $Ax=b$ to the upper triangular equation system $Ux=y$. "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "11d255e0",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"function convert_to_upper_triangular(A,b)\n",
|
|
" # Upper Triangularization: convert Ax=b to Ux=y\n",
|
|
" for k in 1:n\n",
|
|
" for j in k+1:n\n",
|
|
" # Divide by pivot\n",
|
|
" A[k,j] = A[k,j] / A[k,k]\n",
|
|
" end\n",
|
|
" b[k] = b[k] / A[k,k]\n",
|
|
" A[k,k] = 1\n",
|
|
" # Substract lower rows\n",
|
|
" for i in k+1:n \n",
|
|
" for j in k+1:n\n",
|
|
" A[i,j]=A[i,j] - A[i,k] * A[k,j]\n",
|
|
" end\n",
|
|
" b[i] = b[i] - A[i,k] * b[k]\n",
|
|
" A[i,k] = 0\n",
|
|
" end\n",
|
|
" end\n",
|
|
" return A, b #U,y\n",
|
|
"end\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "02c47593",
|
|
"metadata": {},
|
|
"source": [
|
|
"The function in the following cell solves the upper triangular equation system using backwards substitution. "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "3c19497c",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"function solve_upper_triangular(U,y)\n",
|
|
" n = size(U,1)\n",
|
|
" for step in reverse(1:n)\n",
|
|
" if U[step,step] == 0\n",
|
|
" if y[step] != 0\n",
|
|
" return \"No solution\"\n",
|
|
" else\n",
|
|
" return \"Infinity solutions\"\n",
|
|
" end\n",
|
|
" else\n",
|
|
" # Backwards substitution\n",
|
|
" y[step] = y[step] / U[step,step]\n",
|
|
" end\n",
|
|
" for row in reverse(1:step-1)\n",
|
|
" y[row] -= U[row,step] * y[step]\n",
|
|
" end\n",
|
|
" end\n",
|
|
" return y \n",
|
|
"end"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "2c24d85e",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"U,y = convert_to_upper_triangular(A,b)\n",
|
|
"sol = solve_upper_triangular(U,y)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "1c356b5a",
|
|
"metadata": {},
|
|
"source": [
|
|
"We can test if the obtained solution is correct using `@test`:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "5c71828d",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"using Test\n",
|
|
"@test sol ≈ x"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "fe3c5374",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Julia 1.9.1",
|
|
"language": "julia",
|
|
"name": "julia-1.9"
|
|
},
|
|
"language_info": {
|
|
"file_extension": ".jl",
|
|
"mimetype": "application/julia",
|
|
"name": "julia",
|
|
"version": "1.9.1"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|