Julia中如何编写带可变矩阵参数的特征方程函数用于求根?
问题:通过特征方程计算矩阵特征值的传参适配问题
我正在学习Julia的矩阵编程,尝试通过特征方程计算矩阵的特征值。硬编码矩阵的特征方程函数能正常用find_zero求出特征值,但把矩阵作为参数传入函数后,调用find_zero就报错了。我知道Julia内置eigen函数的用法,只是想搞懂怎么写带可变矩阵参数的函数适配find_zero。
硬编码可行版本代码
using LinearAlgebra; using Roots; Δt(t) = det(t * I - Matrix{Int64}([4 2; 3 -1])); # 矩阵硬编码 # 计算特征值 λᵢ function calculateEigenValues() λ = find_zero(Δt, (1, 100)) println(λ) # 输出 = 5 end
传参错误版本代码
using LinearAlgebra; using Roots; using Polynomials; Δt1(t, A::Matrix{Int64}) = det(t * I - A) # 原本硬编码的矩阵改为参数 function calculateEigenValuesV1() x = variable() # 来自Polynomials包 A = Matrix{Int64}([4 2; 3 -1]); λ = find_zero(Δt1(x, A), (1, 100)); # 报错!不知道怎么传值,同时保留另一个变量 println(λ) end
Julia内置eigen函数正确用法示例
A = Matrix{Int64}([4 2; 3 -1]); eigenValAndVec = eigen(A); A = Matrix{Int64}([4 2; 3 -1]); foo = eigen(A); foo.values; foo.vectors; # <-- 正常运行
问题原因与解决方法
问题核心是find_zero需要单变量函数作为输入,而直接调用Δt1(x, A)会直接计算出具体值/多项式对象,不是一个以t为变量的函数。可以通过闭包或匿名函数固定矩阵参数,生成符合要求的单变量函数。
方案1:用闭包生成绑定矩阵的函数
using LinearAlgebra; using Roots; # 定义特征方程生成函数,返回绑定了矩阵A的闭包 function make_characteristic_eq(A::Matrix{Int64}) return t -> det(t * I - A) end function calculateEigenValuesV1() A = Matrix{Int64}([4 2; 3 -1]); Δt1 = make_characteristic_eq(A) # 获取绑定A的单变量函数 λ = find_zero(Δt1, (1, 100)); println(λ) # 输出5 end calculateEigenValuesV1()
方案2:直接用匿名函数简化写法
using LinearAlgebra; using Roots; Δt1(t, A) = det(t * I - A) function calculateEigenValuesV1() A = Matrix{Int64}([4 2; 3 -1]); # 用匿名函数固定A,只保留t作为变量 λ = find_zero(t -> Δt1(t, A), (1, 100)); println(λ) end calculateEigenValuesV1()
说明
find_zero要求第一个参数是输入数值t、返回对应特征多项式值的单变量函数。- 闭包/匿名函数的作用是把矩阵A“固定”,生成只依赖
t的函数,让find_zero能正常迭代求解。 - 之前引入的Polynomials包
variable()是多余的,find_zero不需要多项式对象,只需要能计算每个t对应值的函数。
内容的提问来源于stack exchange,提问作者Qazi Fahim Farhan
相关产品推荐
相关产品推荐

