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

Scilab中能否将多项式作为矩阵进行求值?

在Scilab中实现矩阵的多项式求值(满足Cayley-Hamilton定理的零矩阵预期)

问题根源

你当前代码的问题有两个核心点:

  • poly(A,"x")并非生成A的特征多项式,而是将A的所有元素按列展开作为系数构造高次多项式(3x3矩阵会生成8次多项式),只有特征多项式代入原矩阵才会符合Cayley-Hamilton定理得到零矩阵,这和你的预期逻辑不符。
  • 默认的horner(P,A)和P(A)都是元素级运算,即对A的每个元素单独代入多项式计算,而非执行矩阵乘法意义上的多项式求值。

正确实现步骤

1. 生成矩阵A的特征多项式

要得到满足Cayley-Hamilton定理的特征多项式,有两种可靠方法:

  • 方法一:使用poly函数的"characteristic"参数
A = floor(10*rand(3,3));
// 生成A的特征多项式
P = poly(A, "x", "characteristic");
  • 方法二:通过行列式手动计算(等价于特征多项式)
A = floor(10*rand(3,3));
x = poly(0, "x");
// 特征多项式为det(x*I - A)
P = det(x*eye(size(A)) - A);

2. 对矩阵A进行多项式求值(矩阵乘法意义)

由于Scilab默认的horner是元素级运算,需要手动展开多项式并执行矩阵运算,或自定义一个矩阵多项式求值函数:

function res = matrix_horner(p, M)
    // p是目标多项式,M是待代入的矩阵
    coeffs = coeff(p); // 获取多项式系数,顺序为常数项到最高次项
    res = coeffs(1)*eye(size(M)); // 常数项乘以单位矩阵
    power_M = M; // 存储M的k次幂
    for k=2:length(coeffs)
        res = res + coeffs(k)*power_M;
        power_M = power_M * M; // 迭代计算下一次幂
    end
endfunction

// 使用示例
A = floor(10*rand(3,3));
P = poly(A, "x", "characteristic");
result = matrix_horner(P, A);

运行后result会是近似零矩阵(因浮点数计算误差,元素为极小值,可通过clean(result)处理清零)。

验证结果

执行以下代码可清除浮点数误差,得到严格零矩阵:

clean(result)

内容的提问来源于stack exchange,提问作者cuati

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 14:12:12