【数值方法-Python实现】Crout分解+追赶法实现
涉及Crout分解、追赶法的线性方程组求解方法的Python实现。
Codes
def CroutLU(A:np.ndarray)->Tuple[np.ndarray,np.ndarray]:
"""Crout LU分解算法,A=LU
input:
A: (n,n) np.ndarray,方阵
output:
L: (n,n) np.ndarray,下三角矩阵
U: (n,n) np.ndarray,上三角矩阵,对角线元素为1.0
usage:
```python
A=np.array([[1,2,3,4],
[1,4,9,16],
[1,8,27,64],
[1,16,81,256]])
L,U=CroutLU(A)
print("L矩阵:\n", L)
print("U矩阵:\n", U)
# 验证分解是否正确
print("验证LU是否等于A:\n", np.dot(L, U))
输出:
L矩阵:
[[ 1. 0. 0. 0.]
[ 1. 2. 0. 0.]
[ 1. 6. 6. 0.]
[ 1. 14. 36. 24.]]
U矩阵:
[[1. 2. 3. 4.]
[0. 1. 3. 6.]
[0. 0. 1. 4.]
[0. 0. 0. 1.]]
验证LU是否等于A:
[[ 1. 2. 3. 4.]
[ 1. 4. 9. 16.]
[ 1. 8. 27. 64.]
[ 1. 16. 81. 256.]]
```
"""
row,col=A.shape
n=row
L=np.zeros((n,n))
U=np.zeros((n,n))
for k in range(n):
# 循环列,从k+1列到n列,i=k,...n-1
for i in range(k,n):
L[i,k]=A[i,k]-sum([L[i,s]*U[s,k] for s in range(k)])
for j in range(k-1,n):
U[k,j]=(A[k,j]-sum([L[k,s]*U[s,j] for s in range(k)]))/L[k,k]
return L,U
def LUChaseMethod(A:np.ndarray,d:np.ndarray)->np.ndarray:
"""LU分解法,追赶法求解线性方程组Ax=d
求解三对角矩阵A,d的线性方程组Ax=d,其中A为三对角矩阵,d为右端常数
"""
n=A.shape[0]
# x: x1,x2...xn
x=np.zeros(n)
a=np.zeros(n)
# a:a1,a2...an
# b:b1...bn
# c:c1...cn-1
a[1:],b,c=np.diag(A,k=-1).copy(),np.diag(A,k=0).copy(),np.diag(A,k=1).copy()
L,U=CroutLU(A)
# size: (n-1,) , u0,u1...u(n-1),u0=0
us=np.zeros(n)
us[1:]=np.diag(U,k=1).copy()
# size: (n,) ,ls : l1...ln
ls=np.diag(L,k=0).copy()
# size: (n-1,) , v2...vn-1
vs=np.diag(L,k=-1).copy()
# y: y0,y1...yn , y0=0
y=np.zeros(n+1)
# i=1....n-1
for i in range(1,n):
# print(f"第{i}次迭代")
y_i_1=y[i-1]
a_i=a[i-1]
b_i=b[i-1]
c_i=c[i-1]
d_i=d[i-1]
u_i_1=us[i-1]
l_i=b_i-a_i*u_i_1
u_i=c_i/l_i
y_i=(d_i-a_i*y_i_1)/l_i
y[i]=y_i
ls[i-1]=l_i
us[i]=u_i
ls[-1]=b[n-1]-a[n-1]*us[n-1]
y[n]=(d[n-1]-y[n-1]*a[n-1])/ls[n-1]
x[n-1]=y[n]
for i in range(n-2,-1,-1):
# xi=yi-ui*x(i+1),i=n-2...1
x[i]=y[i+1]-us[i+1]*x[i+1]
return x
Vaildation
from formu_lib import *
import numpy as np
import matplotlib.pyplot as plt
A=np.array([[1,2,3,4],
[1,4,9,16],
[1,8,27,64],
[1,16,81,256]])
L,U=CroutLU(A)
print("L矩阵:\n", L)
print("U矩阵:\n", U)
# 验证分解是否正确
print("验证LU是否等于A:\n", np.dot(L, U))
- 输出:
L矩阵:
[[ 1. 0. 0. 0.]
[ 1. 2. 0. 0.]
[ 1. 6. 6. 0.]
[ 1. 14. 36. 24.]]
U矩阵:
[[1. 2. 3. 4.]
[0. 1. 3. 6.]
[0. 0. 1. 4.]
[0. 0. 0. 1.]]
验证LU是否等于A:
[[ 1. 2. 3. 4.]
[ 1. 4. 9. 16.]
[ 1. 8. 27. 64.]
[ 1. 16. 81. 256.]]

from formu_lib import *
import numpy as np
import matplotlib.pyplot as plt
a=np.array([[2,-1,0,0],[-1,3,-2,0],[0,-2,4,-3],[0,0,-3,5]])
d=np.array([6,1,-2,1])
x=LUChaseMethod(a,d)
print(f"x={x}")
# x=[5. 4. 3. 2.]
答案:[5. 4. 3. 2.],ok
【数值方法-Python实现】Crout分解+追赶法实现的更多相关文章
- Matlab-4:追赶法(crout分解)工具箱
function x=chase (a,b,c,f) % the method of chaase******************************* % a, b, c,分别是是方程组的下 ...
- 百度在线笔试编程测试题(Python):整数分解成素数的积
编程测试题: 输入一个正整数将其分解成素数的乘积,输入格式连续输入m个数,然后将这m个数分别分解,如 输入: 2 10 20 输出: 2 5 2 2 5 Python code: def primes ...
- 【Python Network】分解DNS查询结果
针对DNS查询records,通过NS.PTR.CNAME和MX类别不同,返回数据将包含另外主机名.为了解最终的IP地址,通过将返回信息分解.继续使用PyDNS获取详细信息. #! /usr/bin/ ...
- 机器学习Python实现 SVD 分解
这篇文章主要是结合机器学习实战将推荐算法和SVD进行对应的结合 不论什么一个矩阵都能够分解为SVD的形式 事实上SVD意义就是利用特征空间的转换进行数据的映射,后面将专门介绍SVD的基础概念.先给出p ...
- 初识python: 递归函数 - 分解质因数
分解质因数: 任何一个合数都可以写成几个质数相乘的形式.其中每个质数都是这个合数的因数,叫做这个合数的分解质因数.分解质因数只针对合数. 比如: 8 分解质因数是:2*2*2 10分解质因数是:2*5 ...
- python练习笔记——分解质因数
分解质因数:输入一个正整数,分解质因数:如输入: 90 则打印: 90 = 2 * 3 * 3 * 5 get_str = input("请输入一个100以内的正整数,以分解质因数:&q ...
- 《Python 学习手册4th》 第四章 介绍Python对象类型
''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容(每天看42页内容,可以保证月底看完此书) ''' ...
- Python基础学习篇章三
一. Python对象类型 1. 对象是Python最基本的概念,一个Python程序可以分解为模块.语句.表达式.和对象.它们的关系如下:(1)程序由模块构成 (2)模块包含语句 (3)语句包含表达 ...
- python书籍推荐:Python Cookbook第三版中文
所属网站分类: 资源下载 > python电子书 作者:熊猫烧香 链接:http://www.pythonheidong.com/blog/article/44/ 来源:python黑洞网 内容 ...
- 1、Python快速入门(0529)
学习来自马哥教育的视频,感谢马哥 编程语言: 用户: 问题空间 计算机:解决问题 解空间 抽象: 机器代码-->微码编程-->高级语言 (语言的高下级的是根据语言是否被人类容易理解或者更接 ...
随机推荐
- 武装你的WEBAPI-OData使用Endpoint
本文属于 OData 系列文章 Introduction 更新: 由于新版的 OData 已经默认使用了 endpoint 模式(Microsoft.AspNetCore.OData 8.0.0),不 ...
- Qt开发经验小技巧266-270
从Qt6.4版本开始多媒体模块提供了ffmpeg作为后端解码使用(6.5版本默认就是ffmpeg),可以通过设置环境变量来更改使用哪种后端解码,在main函数的第一行 qputenv("QT ...
- Qt编写可视化大屏电子看板系统16-标准柱状图
一.前言 标准柱状图是大屏系统中最常用的一种展示数据效果图,提供不同的柱子显示数据值,在QCustomPlot的基础上拓展了顶部显示对应的值,不同的柱子不同的颜色,同时还可以调用内置的触发报警颜色的机 ...
- Qt通用方法及类库11
函数名 //判断IP地址及端口是否在线 static bool ipLive(const QString &ip, int port, int timeout = 1000); //获取网页所 ...
- 在jooq的POJO类中使用Lombok的Data注解
jooq生成pojo类的配置根据官方给的如下: https://www.jooq.org/doc/3.14/manual/getting-started/tutorials/jooq-in-7-ste ...
- [AI] 基于大模型的AI搜索引擎
概述:基于大模型的AI搜索引擎 ∈ 大模型智能体应用 AI搜索引擎的架构与组成 用户层:用户输入问题/关键词 Agent层: 用户的输入(当前和历史) + 问题提问模板 => 标准的问题 ... ...
- Golang基础-字节跳动青训营
Golang 安装 访问 https://go.dev/ ,点击 Download ,下载对应平台安装包,安装即可 如果无法访问上述网址,可以改为访问 https://studygolang.com/ ...
- Windows下的GDAL环境配置
Windows下的GDAL环境配置 在Windows下GDAL环境的配置方式有很多种,我尝试了很多不同的配置方式,包括Anaconda. GISInternals.QGIS.OSGeo4W等, 我这里 ...
- w3cschool-微信小程序开发文档-云开发
微信小程序云开发 介绍 2020-07-24 16:19 更新 开发者可以使用云开发开发微信小程序.小游戏,无需搭建服务器,即可使用云端能力. 云开发为开发者提供完整的原生云端支持和微信服务支持,弱化 ...
- w3cschool-Storm 入门教程
Storm 基础知识 基础知识 Storm 是一个分布式的,可靠的,容错的数据流处理系统.它会把工作任务委托给不同类型的组件,每个组件负责处理一项简单特定的任务.Storm 集群的输入流由一个被称作 ...