首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >极大值中的匹配商函数

极大值中的匹配商函数
EN

Stack Overflow用户
提问于 2018-10-25 09:36:20
回答 1查看 120关注 0票数 1

我们有一个在线平台,我们在后台使用maxima对学生的答案进行反馈。

假设多项式长除法的解是以下函数:

代码语言:javascript
运行
复制
sol: 3+(2+4*x)/(3*x^2+2*x+8);

假设学生给出了答案:

代码语言:javascript
运行
复制
ans: 3 +(3-5*x)/(3x^2+2*x+8)

然后,我们想要按照这些思路给出反馈。

你的回答确实有以下形式:

常数s是正确的,但是没有选择正确的线性函数r(x)。

我试图以以下方式实现这一反馈:

代码语言:javascript
运行
复制
ans: 3 +(3-5*x)/(3x^2+2*x+8);
remvalue(a,b,c,d);
matchdeclare([a,b,c,d], constantp);
defmatch(match, d+ (a*x+b)/(3*x^2+2*x+8));
match(ans);

然而,不匹配似乎无法与此相匹配。还有其他函数可以用来匹配商函数吗?

它确实适用于更简单的场景:

代码语言:javascript
运行
复制
ans: (3-5*x)/(3*x^2+2*x+8); 
remvalue(a,b,c);
matchdeclare([a,b,c], constantp);     
defmatch(match, (a*x+b)/(3*x^2+2*x+8));     
match(ans);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-25 19:07:23

如果问题都是多项式除法,则可以使用divide函数返回商和余数,然后验证学生的输入与商+余数/除数相同。

至于匹配商+余数/除数,defmatch可能不够强大,因为它主要(虽然不是完全)在寻找正式匹配,而且在许多情况下,它不能检测出等价但形式不同的表达式。

让我考虑一下如何为这个问题实现一个匹配函数。也许其他人也有一个建议。

编辑:下面是一种匹配这些表达式的方法。我将把多项式的比率从其他术语中分离出来。如果有一个比率项,而其他所有项都是多项式,那么您想要的模式是匹配的。

我至少使用了一个模糊但有用甚至可以理解的"+"表达式匹配特性。由于"+"是可交换的,模式匹配器会清除与尝试的第一个谓词匹配的所有参数,然后对第二个谓词进行遍历,因此,如果有两个以上的预测。如果声明了任何模式匹配变量来匹配all,那么它将匹配所有参数,并且没有剩下的参数。模式变量将按反向顺序尝试,因此aa将被最后处理。其效果是将"+"表达式划分为与声明的谓词和所有其他内容匹配的术语。这是在%i7中使用的。

代码语言:javascript
运行
复制
(%i2) matchdeclare (pp, lambda ([e], polynomialp (e, [pvar]))) $
(%i3) matchdeclare (qq, lambda ([e], diff (e, pvar) # 0 and polynomialp (e, [pvar]))) $
(%i4) defmatch (match_pratio, pp/qq, pvar) $
(%i5) matchdeclare (aa, all) $
(%i6) matchdeclare (rr, lambda ([e], match_pratio (e, pvar) # false)) $
(%i7) defmatch (match_pratio_plus_remainder, rr + aa, pvar) $
(%i8) match_foo (e, pvar) := 
  block ([aa, pp, qq, rr],
    if match_pratio (e, pvar) # false
      then [0, pp, qq, pp/qq]
    elseif match_pratio_plus_remainder (e, pvar) # false
      then if polynomialp (aa, [pvar]) and op(rr) # "+"
        then [aa, pp, qq, rr]) $

下面是一些匹配的示例:

代码语言:javascript
运行
复制
(%i9) match_foo (u^2/2 - 3*u + 1 + (u - 1)/(u^2 + u - 1), u);
            2
           u                     2            u - 1
(%o9)     [-- - 3 u + 1, u - 1, u  + u - 1, ----------]
           2                                 2
                                            u  + u - 1
(%i10) match_foo (u^2/2 - 3*u + 1 - 2*(u - 1)/(u^2 + u - 1), u);
         2
        u                           2            2 (u - 1)
(%o10) [-- - 3 u + 1, - 2 (u - 1), u  + u - 1, - ----------]
        2                                         2
                                                 u  + u - 1
(%i11) match_foo (u^2/2 - 3*u + 1 - 2/(u^2 + u - 1), u);
            2
           u                   2                2
(%o11)    [-- - 3 u + 1, - 2, u  + u - 1, - ----------]
           2                                 2
                                            u  + u - 1
(%i12) match_foo (1 - 2/(u^2 + u - 1), u);
                         2                2
(%o12)         [1, - 2, u  + u - 1, - ----------]
                                       2
                                      u  + u - 1
(%i13) match_foo (- 2/(u^2 + u - 1), u);
                         2                2
(%o13)         [0, - 2, u  + u - 1, - ----------]
                                       2
                                      u  + u - 1

以下是一些不匹配的例子:两个多项式比率项、无多项式比率和一个非多项式项。

代码语言:javascript
运行
复制
(%i14) match_foo (1/u - 2/(u^2 + u - 1), u);
(%o14)                        false
(%i15) match_foo (1 - (u^2 + u - 1)/2, u);
(%o15)                        false
(%i16) match_foo (sin(u) - 2/(u^2 + u - 1), u);
(%o16)                        false

第二个编辑:我想我把match_pratio_plus_remainder的名字错了,应该是match_remainder_plus_quotient。哦,好吧。

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

https://stackoverflow.com/questions/52986045

复制
相关文章

相似问题

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