You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 15:30:42