对于一个学生学习平台(数学),我们设法包含了最大值,并评估了等价物的术语/方程/数字。为此,我们编写了一个算法,随机选择所有变量的数字,然后比较这两个结果是否导致相同的值(从数学上讲,我们将这些项看作函数,并在特定的地方进行比较)。
现在问题来了:不幸的是,必须有可能定义变量系数的范围。例如,在x=10位置上的正确解4,5x^2-3,4x导致4,5*10^2-3,4*10。这里我们必须找到这个表达式的最小/最大值,例如,在x^2之前,4到5的范围作为系数。我无法用本机极大函数来做这件事,所以我在这里寻求帮助。我还想知道,这是否可以与其他函数(如sin、e等)结合,或者这是否使整个优化问题过于复杂(而且我们应该只允许多项式)。
非常感谢您的帮助!
最好的,里昂
发布于 2021-12-31 00:29:01
总结一下我们在评论中所说的,我们有类似于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]);这将返回一个列表,该列表包含最大值、和达到最大值的拐角以及由于对应的e[k]在x = x1处为零而省略的变量列表。
该解决方案使用了最近添加的cartesian_product_list (Maxima5.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的任何函数(前提是当x1是一个数字时,subst(x = x1, e[k])简化为一个数字--这是大多数或所有内置的数学函数的情况)。
https://stackoverflow.com/questions/70526329
复制相似问题