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

如何在Maple中实现对求和式内索引变量的求导?

解决Maple中多变量向量函数导数求和的通用实现

问题根源

原代码的核心问题在于:

  • 用seq定义的变量序列无法保留索引关联,导致求和时求导算子无法正确识别目标变量;
  • 向量函数F定义为接受多个独立参数,而非统一的向量输入,适配多维度场景时容易出现变量绑定混乱。

通用解决方案

步骤1:用数组/列表定义变量

将输入变量定义为数组(或列表),确保索引变量x[i]能被求导算子正确识别,避免序列带来的作用域问题。

步骤2:统一向量函数的输入参数

将向量函数F定义为接受单个向量参数,适配任意维度的输入,避免多参数传递的混淆。

步骤3:正确实现导数求和

使用seq结合sum完成每个分量的导数-变量乘积求和,或用D算子简化求导操作。

代码示例

基础一阶导数求和(适配任意n)

n := 2;
# 定义输入变量数组(支持任意n扩展)
X := Array(1..n, i -> x[i]);
Y := Array(1..n, i -> y[i]);

# 定义n维向量函数,接受单个向量参数X
F := X -> [
    exp(X[1]^3 * X[2]) - 1,
    X[2]^2 - 5*X[2]*X[1]
];

# 计算每个分量的导数与Y分量的乘积和
seq( sum( diff(F(X)[i], X[j]) * Y[j], j=1..n ), i=1..n );

运行结果:

3 x[1]^2 x[2] exp(x[1]^3 x[2]) y[1] + x[1]^3 exp(x[1]^3 x[2]) y[2], 
-5 x[2] y[1] + (2 x[2] - 5 x[1]) y[2]

使用D算子简化求导

D算子可以直接对函数的指定分量求导,代码更简洁:

n := 2;
X := Array(1..n, i -> x[i]);
Y := Array(1..n, i -> y[i]);

F_D := X -> [
    exp(X[1]^3 * X[2]) - 1,
    X[2]^2 - 5*X[2]*X[1]
];

# D[j](F_D)(X) 表示F_D对X的第j个分量求导后在X处的值
seq( sum( D[j](F_D)(X)[i] * Y[j], j=1..n ), i=1..n );

嵌套求和场景(二阶导数示例)

如果需要嵌套求和(比如Hessian与变量的二次型),只需扩展求和层数:

# 计算每个分量的二阶导数与Y分量乘积的嵌套求和
seq( sum( sum( diff(F(X)[i], X[j], X[k]) * Y[j] * Y[k], j=1..n ), k=1..n ), i=1..n );

原代码错误原因说明

原代码中xvars := seq(x[i], i=1..n)生成的是无结构的序列x[1],x[2],调用F(xvars)时会将序列元素逐个传递给F的参数x和y,导致F内部变量与索引变量x[i]的关联断裂。同时,求和时xvars[j]被解析为符号xvars[j]而非具体的x[j],Maple认为F(xvars)[i]与该符号无关,因此求导结果为0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 08:35:57