【数值方法-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)
学习来自马哥教育的视频,感谢马哥 编程语言: 用户: 问题空间 计算机:解决问题 解空间 抽象: 机器代码-->微码编程-->高级语言 (语言的高下级的是根据语言是否被人类容易理解或者更接 ...
随机推荐
- 【XML】Java创建XML文档
package example01; import org.w3c.dom.Document; import org.w3c.dom.Element; import javax.xml.parsers ...
- shell 下 exec,source,.,bash和sh以及export得区别
exec执行命令时,不会启用新的shell进程. source和 .也不会启用新的shell进程,在当前shell中执行,设定的局部变量在执行完命令后仍然有效. bash或sh执行时,会另起一个子 ...
- APP网站小程序微信登录同步:需要微信公众号、小程序、开放平台打通用户体系(不同主体也行)
要想APP网站小程序微信登录同步打通用户体系.我们需要将(不同主体也行)多个公众号和小程序都绑定到同一个微信开放平台上,获取到UnionID记录到数据库就可以了. 微信UnionID 机制说明 如果开 ...
- UML之包的导入与访问
包是UML中管理元素的有效手段,UML中的所有元素均隶属于某一个包,即使你没有指定元素所属的包,这些元素也会被置于一个默认包中,包的本质是命名空间.当我们在一个包中需要访问另一个包中的元素时,可以使用 ...
- 回顾 2024 年 19 期C#/.NET/.NET Core技术前沿周刊
前言 转眼之间2024年就只剩最后一天了,咱们的C#/.NET/.NET Core技术前沿周刊也从8月份的第 1 期持续更新到现在已经更新到了第 19 期了,今天咱们一起来回顾一下 2024 年 19 ...
- Ubuntu安装宝塔服务
Linux面板7.9.4安装脚本 查看详细安装教程 使用 SSH 连接工具,如 堡塔SSH终端 连接到您的 Linux 服务器后, 挂载磁盘 ,根据系统执行相应命令开始安装(大约2分钟完成面板安装): ...
- ofd轻阅读---采用Typescript全新开发,让阅读、批注更方便!
前言 浏览器内核已支持pdf文件的渲染,这极大的方便了pdf文件的阅读和推广.ofd文件作为国产板式标准,急需一套在浏览器中渲染方案. 本人研究ofd多年,分别采用qt.c# 开发了ofd阅读器.本 ...
- uwp IProgress<T>进度通知。
主要是利用 Pp_ProgressChanged 报告进度: private void BtnDownload_Click(object sender, RoutedEventArgs e) { va ...
- 微服务实战系列(十)-网关高可用之中间件Keepalived-copy
1.场景描述 因为要做网关的高可用,用到了keepalived+nginx,来保证nginx的高可用,如下图: 安装了keepavlived,走了一些弯路,记录下吧,nginx的安装就不多说了,博客已 ...
- RFID基础——概念与分类
RFID 的全称是射频识别技术(Radio Frequency Identification).是一项利用射频信号通过空间耦合(交变磁场或电磁场)实现无接触信息传递并通过所传递的信息达到识别目的的技术 ...