
Taichi 稀疏矩阵怎么求解线性方程组SparseSolver 直接法与 SparseCG 迭代法用法【免费下载链接】taichiProductive, portable, and performant GPU programming in Python.项目地址: https://gitcode.com/GitHub_Trending/ta/taichi在 Taichi 里用SparseMatrix组装好系数矩阵后求解形如Ax b的线性方程组有两条官方路径直接法ti.linalg.SparseSolver和共轭梯度迭代法ti.linalg.SparseCG。两者都构建在同一个SparseMatrix之上区别在于求解器本身的创建方式和求解步骤。本文按「先构建稀疏矩阵再选求解器」的顺序给出可直接运行的完整代码、后端能力差异和求解成功与否的判断方式适用后端为 CPUx64/arm64和 CUDA。先构建系数矩阵SparseMatrixBuilder 三步流程两个求解器都要求系数矩阵A是SparseMatrix类型构建流程固定为三步对应 Sparse Matrix 文档用ti.linalg.SparseMatrixBuilder(n, m, max_num_triplets...)创建 builder在ti.kernel中向 builder 填充数据当前只支持和-运算符调用K.build()得到SparseMatrix。max_num_triplets必须不小于矩阵中非零元素的数量否则三元组会溢出。以n x n的网格型稀疏矩阵为例stable_fluid 示例 中每个未知数最多贡献 5 个非零元因此传入max_num_tripletsN * 6。数据类型是硬限制文档标注该功能仍在开发中CPU 后端稀疏矩阵 dtype 只支持f32和f64CUDA 后端只支持f32。SparseSolver 直接法analyze_pattern → factorize → solve直接法求解Ax b的操作顺序是用ti.linalg.SparseSolver(solver_type, ordering)创建求解器。CPU 后端支持的分解类型为LLT、LDLT、LU支持的排序ordering为AMD和COLAMDCUDA 后端只支持LLT。源码中默认参数为solver_typeLLT、orderingAMD依次调用solver.analyze_pattern(A)和solver.factorize(A)完成矩阵分析与分解。也可以改用solver.compute(A)源码注释说明它等价于「先analyze_pattern再factorize」调用x solver.solve(b)得到解。CPU 后端上x和b可以是 NumPy 数组、Taichi Ndarray 或 Taichi fieldCUDA 后端上x和b必须是 Taichi Ndarray调用solver.info()检查求解是否成功返回True表示成功。下面是 linear_solver 文档给出的完整可运行示例import taichi as ti arch ti.cpu # or ti.cuda ti.init(archarch) n 4 K ti.linalg.SparseMatrixBuilder(n, n, max_num_triplets100) b ti.ndarray(ti.f32, shapen) ti.kernel def fill(A: ti.types.sparse_matrix_builder(), b: ti.types.ndarray(), interval: ti.i32): for i in range(n): A[i, i] 2.0 if i % interval 0: b[i] 1.0 fill(K, b, 3) A K.build() print( Matrix A:) print(A) print( Vector b:) print(b) # outputs: # Matrix A: # [2, 0, 0, 0] # [0, 2, 0, 0] # [0, 0, 2, 0] # [0, 0, 0, 2] # Vector b: # [1. 0. 0. 1.] solver ti.linalg.SparseSolver(solver_typeLLT) solver.analyze_pattern(A) solver.factorize(A) x solver.solve(b) success solver.info() print( Solve sparse linear systems Ax b with the solution x:) print(x) print(f Computation succeed: {success})文档示例输出为示例结果非固定预期 Solve sparse linear systems Ax b with the solution x: [0.5 0. 0. 0.5] Computation was successful?: True判断求解是否完成的依据是solver.info()的返回值True表示求解过程成功。注意文档同时提示SparseSolver只支持 CPU 与 CUDA 后端传入不支持的solver_type/ordering组合时构造函数会抛出TaichiRuntimeError并列出支持的组合。SparseCG 迭代法构造即绑定矩阵与右端项共轭梯度迭代法的流程更短矩阵与右端项在构造求解器时一并传入用ti.linalg.SparseCG(A, b, x0, max_iter, atol)创建求解器其中A是SparseMatrixb是方程组右端项x0是初始猜测max_iter是最大迭代次数atol是绝对容差阈值。源码默认值为x0None、max_iter50、atol1e-6调用x, exit_code solver.solve()获得解x与状态码exit_code求解成功时exit_code为True。SparseMatrix的构建过程与直接法完全相同唯一差别是创建SparseCG而不是SparseSolver。文档示例import taichi as ti ti.init(archti.cpu) n 4 K ti.linalg.SparseMatrixBuilder(n, n, max_num_triplets100) b ti.ndarray(ti.f32, shapen) ti.kernel def fill(A: ti.types.sparse_matrix_builder(), b: ti.types.ndarray(), interval: ti.i32): for i in range(n): A[i, i] 2.0 if i % interval 0: b[i] 1.0 fill(K, b, 3) A K.build() solver ti.linalg.SparseCG(A, b) x, exit_code solver.solve() print( Solve sparse linear systems Ax b with the solution x:) print(x) print(f Computation was successful?: {exit_code})文档示例输出为示例结果非固定预期 Solve sparse linear systems Ax b with the solution x: [0.5 0. 0. 0.5] Computation was successful?: True成功与否以solve()返回的exit_code判断True表示求解成功。两个求解器的适用边界选求解器前先确认矩阵类型如果系数矩阵A是SparseMatrix就只能用SparseSolver或SparseCGTaichi 的另一类求解器MatrixfreeCG面向LinearOperator矩阵-free 表示与SparseMatrix不通用。与求解器直接相关的后端差异汇总如下均来自官方文档与源码项目CPUx64/arm64CUDA稀疏矩阵 dtypef32、f64仅f32SparseSolver 分解类型LLT、LDLT、LU仅LLT排序 orderingAMD、COLAMD仅LLT场景solve(b)的b/x类型NumPy 数组、Taichi Ndarray、Taichi field必须是 Taichi Ndarray实际使用可以参考仓库中的两个示例stable_fluid.py 用稀疏 Laplacian 矩阵求解 Poisson 压力方程analyze_pattern/factorize只在网格尺寸确定后执行一次implicit_mass_spring.py 用solver_typeLDLT的SparseSolver求解隐式质量弹簧系统的线性方程组右端项b由K vel等稀疏矩阵运算组装得到。完整用法与更多示例见 linear_solver 文档 和 sparse_matrix 文档。【免费下载链接】taichiProductive, portable, and performant GPU programming in Python.项目地址: https://gitcode.com/GitHub_Trending/ta/taichi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考