期限结构的间隔
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]
为零。让我们寻找并省略这样的系数,那么只能有一个独特的最大值。)
这是我对解决方案的尝试,希望我已经了解正在发生的事情以及需要发生的事情。不检查就假设a
、e
、I
都是等长的,即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
是数字时简化为数字——大多数或所有内置数学函数都是这种情况) .
对于学生学习平台(数学),我们成功地包含了 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]
为零。让我们寻找并省略这样的系数,那么只能有一个独特的最大值。)
这是我对解决方案的尝试,希望我已经了解正在发生的事情以及需要发生的事情。不检查就假设a
、e
、I
都是等长的,即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
是数字时简化为数字——大多数或所有内置数学函数都是这种情况) .