首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >术语结构的区间

术语结构的区间
EN

Stack Overflow用户
提问于 2021-12-30 00:28:57
回答 1查看 46关注 0票数 1

对于一个学生学习平台(数学),我们设法包含了最大值,并评估了等价物的术语/方程/数字。为此,我们编写了一个算法,随机选择所有变量的数字,然后比较这两个结果是否导致相同的值(从数学上讲,我们将这些项看作函数,并在特定的地方进行比较)。

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

非常感谢您的帮助!

最好的,里昂

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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]为零。让我们寻找并省略这样的系数,那么就只能有一个唯一的最大值。)

这是我尝试的解决方案,希望我已经理解了发生了什么,需要发生什么。假设不检查aeI都是相同的长度,即n

代码语言:javascript
复制
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,我可以编写一个简单的实现。

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

代码语言:javascript
复制
(%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])简化为一个数字--这是大多数或所有内置的数学函数的情况)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70526329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档