期限结构的间隔

Intervals for term structures

对于学生学习平台(数学),我们成功地包含了 Maxima 并评估 terms/equations/numbers 等价性。为此,我们编写了一个算法,随机选择所有变量的数字,然后比较两个结果是否导致相同的值(从数学上讲,我们将这些项视为函数并在特定位置进行比较)。

现在问题来了:不幸的是,必须有可能定义变量系数的范围。所以例如位置 x=10 处的正确解 [4,5]x^2-[3,4]x 导致 [4,5]*10^2-[3,4]*10。在这里我们必须找到这个表达式的 minimum/maximum 例如4 到 5 的范围作为 x^2 之前的系数。我无法使用本机 Maxima 函数执行此操作,因此我在这里寻求帮助。我也想知道这是否可以与其他函数(如 sin、e 等)结合使用,或者这是否会使整个优化问题过于复杂(我们应该只允许多项式)。

非常感谢您的帮助!

最好的,莱昂

总结一下我们在评论中所说的内容,我们有类似 sum(a[k]*e[k], k, 1, n) 的内容,其中系数 a[k] 受区间 I[k] 约束,而 e[k]x。鉴于x是一个特定的值,那么总和是a[k]的线性组合,极值位于由区间的笛卡尔积给出的超立方体的角点。

一个简单的解决方案是只枚举超立方体的角并计算每个角的总和,看看哪个最大。 (如果有关系,这意味着总和实际上不是某个系数的函数。给定问题陈述,这意味着相应的 e[k] 为零。让我们寻找并省略这样的系数,那么只能有一个独特的最大值。)

这是我对解决方案的尝试,希望我已经了解正在发生的事情以及需要发生的事情。不检查就假设aeI都是等长的,即n.

find_maximum_corner (a, e, I, x, x1) :=
    block ([n, ee, ii_omit, a_omit, ii_keep, a_keep, e_keep, I_keep,
            corners_positions, corners_equations, corners_values,
            maximum_value, ii_maximum_value],
           n: length(a),
           ee: subst (x = x1, sum (a[k]*e[k], k, 1, n)),
           ii_omit: sublist_indices (e, lambda ([e1], subst (x = x1, e1) = 0)),
           a_omit: makelist (a[i], i, ii_omit),
           ii_keep: sublist (makelist (i, i, 1, n), lambda ([i1], not member (i1, ii_omit))),
           a_keep: makelist (a[i], i, ii_keep),
           e_keep: makelist (e[i], i, ii_keep),
           I_keep: makelist (I[i], i, ii_keep),
           corners_positions: apply (cartesian_product_list, I_keep),
           corners_equations: map (lambda ([l], map (lambda ([a1, l1], a1 = l1), a_keep, l)), corners_positions),
           corners_values: map (lambda ([eqs], subst (eqs, ee)), corners_equations),
           maximum_value: lmax (corners_values),
           ii_maximum_value: sublist_indices (corners_values, lambda ([v], v = maximum_value)),
           [maximum_value, corners_equations[ii_maximum_value[1]], a_omit]);

那个returns一个列表,包括最大值,和达到最大值的角,以及由于对应的e[k]x = x1处为零而省略的变量列表.

此解决方案利用了最近添加的 cartesian_product_list(在 Maxima 5.43 中)。如果你使用的是 5.43 之前的版本,我可以写一个简单的实现。

通过这个解决方案,我得到:

(%i6) find_maximum_corner ([a, b, c], [x, -x^2, x^3], [[3, 4], [-2, 2], [4, 5]], x, 3);
(%o6)          [165, [a = 4, b = - 2, c = 5], []]
(%i7) find_maximum_corner ([a, b, c], [x, -(x - 3)^2, x^3], [[3, 4], [-2, 2], [4, 5]], x, 3);
(%o7)              [147, [a = 4, c = 5], [b]]

第二个示例显示了一个因对应表达式为零而丢失的变量。

表达式e[k]不一定是多项式;它们可以是 x 的任何函数(前提是 subst(x = x1, e[k])x1 是数字时简化为数字——大多数或所有内置数学函数都是这种情况) .