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

如何让Maxima支持维度和内容未定义的矩阵运算?

Maxima 矩阵维度与块矩阵操作问题解答

核心结论与操作方案

Maxima 默认采用静态维度矩阵设计,matrix() 函数创建时确实需要整数常量定义维度,但这不代表无法处理块矩阵(子矩阵组合的父矩阵),只是你的写法未遵循其块矩阵处理规则——直接将子矩阵变量放入matrix()时,Maxima会将它们识别为标量元素,而非子矩阵。

块矩阵的正确实现方式

要实现子矩阵组合父矩阵的操作,需先加载blockmatrix包,再用blockmatrix()函数构造分块矩阵:

load(blockmatrix); /* 加载块矩阵处理包 */
/* 先定义各子矩阵(需明确维度) */
Jm: matrix([m11, m12], [m21, m22]);
Jms: matrix([ms1], [ms2]);
Jsm: matrix([sm1, sm2]);
Js: matrix([s11]);
/* 构造块矩阵 */
J: blockmatrix([[Jm, Jms], [Jsm, Js]]);

这样构造的J会被正确识别为分块矩阵,后续的乘法、求逆操作将按矩阵规则执行,不会再把子矩阵当作标量处理。

关于declare()函数

declare()确实仅适用于标量类型声明(比如declare(x, integer);),无法直接声明矩阵类型或维度。若要判断矩阵类型,可使用matrixp()函数;若要获取或设置矩阵维度,可使用dimension()函数(同样需要静态整数维度)。

你的代码修正示例

针对你提供的代码,调整为块矩阵写法后可正常运算:

load(blockmatrix);
/* 定义子矩阵 */
Jm: matrix([m11, m12], [m21, m22]);
Jms: matrix([ms1], [ms2]);
Jsm: matrix([sm1, sm2]);
Js: matrix([s11]);
xm: matrix([x1], [x2]);
xs: matrix([x3]);
fm: matrix([f1], [f2]);
fs: matrix([f3]);

/* 构造块矩阵 */
J: blockmatrix([[Jm, Jms], [Jsm, Js]]);
x: blockmatrix([[xm], [xs]]);
f: blockmatrix([[fm], [fs]]);

/* 执行矩阵运算 */
eq: J . x - f = 0;
sol: invert(J) . f;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 12:24:57