涉及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分解+追赶法实现的更多相关文章

  1. Matlab-4:追赶法(crout分解)工具箱

    function x=chase (a,b,c,f) % the method of chaase******************************* % a, b, c,分别是是方程组的下 ...

  2. 百度在线笔试编程测试题(Python):整数分解成素数的积

    编程测试题: 输入一个正整数将其分解成素数的乘积,输入格式连续输入m个数,然后将这m个数分别分解,如 输入: 2 10 20 输出: 2 5 2 2 5 Python code: def primes ...

  3. 【Python Network】分解DNS查询结果

    针对DNS查询records,通过NS.PTR.CNAME和MX类别不同,返回数据将包含另外主机名.为了解最终的IP地址,通过将返回信息分解.继续使用PyDNS获取详细信息. #! /usr/bin/ ...

  4. 机器学习Python实现 SVD 分解

    这篇文章主要是结合机器学习实战将推荐算法和SVD进行对应的结合 不论什么一个矩阵都能够分解为SVD的形式 事实上SVD意义就是利用特征空间的转换进行数据的映射,后面将专门介绍SVD的基础概念.先给出p ...

  5. 初识python: 递归函数 - 分解质因数

    分解质因数: 任何一个合数都可以写成几个质数相乘的形式.其中每个质数都是这个合数的因数,叫做这个合数的分解质因数.分解质因数只针对合数. 比如: 8 分解质因数是:2*2*2 10分解质因数是:2*5 ...

  6. python练习笔记——分解质因数

    分解质因数:输入一个正整数,分解质因数:如输入: 90   则打印: 90 = 2 * 3 * 3 * 5 get_str = input("请输入一个100以内的正整数,以分解质因数:&q ...

  7. 《Python 学习手册4th》 第四章 介绍Python对象类型

    ''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容(每天看42页内容,可以保证月底看完此书) ''' ...

  8. Python基础学习篇章三

    一. Python对象类型 1. 对象是Python最基本的概念,一个Python程序可以分解为模块.语句.表达式.和对象.它们的关系如下:(1)程序由模块构成 (2)模块包含语句 (3)语句包含表达 ...

  9. python书籍推荐:Python Cookbook第三版中文

    所属网站分类: 资源下载 > python电子书 作者:熊猫烧香 链接:http://www.pythonheidong.com/blog/article/44/ 来源:python黑洞网 内容 ...

  10. 1、Python快速入门(0529)

    学习来自马哥教育的视频,感谢马哥 编程语言: 用户: 问题空间 计算机:解决问题 解空间 抽象: 机器代码-->微码编程-->高级语言 (语言的高下级的是根据语言是否被人类容易理解或者更接 ...

随机推荐

  1. 武装你的WEBAPI-OData使用Endpoint

    本文属于 OData 系列文章 Introduction 更新: 由于新版的 OData 已经默认使用了 endpoint 模式(Microsoft.AspNetCore.OData 8.0.0),不 ...

  2. Qt开发经验小技巧266-270

    从Qt6.4版本开始多媒体模块提供了ffmpeg作为后端解码使用(6.5版本默认就是ffmpeg),可以通过设置环境变量来更改使用哪种后端解码,在main函数的第一行 qputenv("QT ...

  3. Qt编写可视化大屏电子看板系统16-标准柱状图

    一.前言 标准柱状图是大屏系统中最常用的一种展示数据效果图,提供不同的柱子显示数据值,在QCustomPlot的基础上拓展了顶部显示对应的值,不同的柱子不同的颜色,同时还可以调用内置的触发报警颜色的机 ...

  4. Qt通用方法及类库11

    函数名 //判断IP地址及端口是否在线 static bool ipLive(const QString &ip, int port, int timeout = 1000); //获取网页所 ...

  5. 在jooq的POJO类中使用Lombok的Data注解

    jooq生成pojo类的配置根据官方给的如下: https://www.jooq.org/doc/3.14/manual/getting-started/tutorials/jooq-in-7-ste ...

  6. [AI] 基于大模型的AI搜索引擎

    概述:基于大模型的AI搜索引擎 ∈ 大模型智能体应用 AI搜索引擎的架构与组成 用户层:用户输入问题/关键词 Agent层: 用户的输入(当前和历史) + 问题提问模板 => 标准的问题 ... ...

  7. Golang基础-字节跳动青训营

    Golang 安装 访问 https://go.dev/ ,点击 Download ,下载对应平台安装包,安装即可 如果无法访问上述网址,可以改为访问 https://studygolang.com/ ...

  8. Windows下的GDAL环境配置

    Windows下的GDAL环境配置 在Windows下GDAL环境的配置方式有很多种,我尝试了很多不同的配置方式,包括Anaconda. GISInternals.QGIS.OSGeo4W等, 我这里 ...

  9. w3cschool-微信小程序开发文档-云开发

    微信小程序云开发 介绍 2020-07-24 16:19 更新 开发者可以使用云开发开发微信小程序.小游戏,无需搭建服务器,即可使用云端能力. 云开发为开发者提供完整的原生云端支持和微信服务支持,弱化 ...

  10. w3cschool-Storm 入门教程

    Storm 基础知识 基础知识 Storm 是一个分布式的,可靠的,容错的数据流处理系统.它会把工作任务委托给不同类型的组件,每个组件负责处理一项简单特定的任务.Storm 集群的输入流由一个被称作 ...