跳转至

pl-symbolic-input元件

填写允许输入数学符号的空白字段。

样品元素

pl-symbolic-input 元素的屏幕截图

question.html
<pl-symbolic-input answers-name="symbolic_math" variables="x, y" label="$z =$"></pl-symbolic-input>
server.py
import prairielearn as pl
import sympy

def generate(data):

    # Declare math symbols
    x, y = sympy.symbols("x y")

    # Describe the equation
    z = x + y + 1

    # Answer to fill in the blank input stored as JSON.
    data["correct_answers"]["symbolic_math"] = pl.to_json(z)

定制

属性 类型 默认 描述
additional-simplifications 字符串 - 在使用 SymPy 的内置相等检查器之前,应在评分过程中应用简化。使用此属性可以防止分级过程中罕见的不收敛情况。使用此属性之前,请参阅非收敛部分 以获取更多详细信息。
allow-blank 布尔 是否允许输入框为空。默认情况下,空输入框不会被评分(格式无效)。
allow-complex 布尔 是否允许复数(以ij为虚数单位的表达式)。
allow-sets 布尔 是否允许设置和间隔表示法。 更多详情请见下文
allow-trig-functions 布尔 真实 是否允许三角函数(cosatanh,...)。
answers-name 字符串 用于存储数据的变量名称。请注意,该属性在问题中必须是唯一的,即该属性的值不应在问题中重复。如果正确答案在 server.py 中设置为复杂对象,则应使用 import prairielearn as pldata["correct_answers"][answers-name] = pl.to_json(ans)
aria-label 字符串 输入的可访问标签。
blank-value 字符串 0 (zero) 如果答案留空,则用作答案的表达式。仅当 allow-blanktrue 时适用。必须是 ""(空字符串)或遵循与预期用户输入相同的格式(例如,相同的变量等)。
correct-answer 字符串 查看描述 正确答案可用于评分。默认为 data["correct_answers"][answers-name]。空白正确答案 (correct-answer="") 仅在 allow-blank="true"blank-value="" 时有效。
custom-functions 字符串 可在符号表达式中使用的以逗号分隔的自定义函数列表。
display "block""inline" "inline" 如何显示输入字段。
display-log-as-ln 布尔 false 显示提交内容和正确答案时是否应使用 ln 而不是 log。两者被认为是等效的,学生可以在提交的答案中使用。
display-simplified-expression 布尔 true 学生提交的表达是否应以简化形式显示。设置 display-simplified-expression="false" 可以防止可能使学生感到困惑的意外简化。请注意,无论此设置如何,出于评分目的,答案始终会被简化。
formula-editor 布尔 该元素是否应为学生提供可视化公式编辑器(当答案很长或包含嵌套数学表达式时推荐)。
imaginary-unit-for-display 字符串 "i" 用于显示的虚数单位。它必须是 "i""j"。再次强调,这_仅_用于显示。当 allow-complex="true" 时,学生可以在提交的答案中使用 ij
initial-value 字符串 第一次渲染时预填充输入框的初始值。
label 字符串 显示在输入框之前的前缀(例如,label="$F =$")。
placeholder 字符串 "symbolic expression" 输入框中显示的提示描述了预期的输入类型。
show-help-text 布尔 真实 在显示所需输入参数的输入末尾显示问号。
show-score 布尔 真实 是否在此元素旁边显示分数徽章。
size 整数 35 35输入框的大小。
suffix 字符串 显示在输入框之后的后缀(例如,suffix="$\rm m/s^2$")。
variables 字符串 可在符号表达式中使用的以逗号分隔的符号列表。
weight 整数 1 计算元素的加权平均分数时使用的权重。

细节

正确答案最好创建为 sympy 表达式,并使用 pl.to_json 转换为 json。也可以简单地将正确答案指定为字符串,例如 x + y + 1

与希腊字母同名的变量(例如 alphabeta 等)将自动转换为其 LaTeX 等效项,以显示在正确答案和提交面板上。

如果是 allow-complex="true",请勿在 variables 列表中包含 ij,并且不要在 variables 列表中包含任何其他保留名称(epicossin等)。元素代码将检查(并禁止)variablescustom-functions 列表和保留名称之间的冲突。

请注意,在评估学生答案时,在正确答案中使用附加假设创建的变量将尊重这些假设。 有关详细信息,请参阅示例问题。

设置符号

如果是 allow-sets="true",则启用以下附加语法层:

  • 设置具有显式列出成员的文字(例如 {1, 2, 3}{0, 2pi/3, 4pi/3}{ {}, { {} } }
  • 间隔集合表示法,包括 $\infty$(例如 (-sin(x), +sin(x))(-infty, 5][2, oo]
  • 常用集合运算符:并集(Ucup+|)、 交集(cap&)和差值 (-)

示例实现

  • [元素/符号输入]

参见

分级不收敛

在极少数情况下,pl-symbolic-input 问题元素可以生成评分结果,在评分过程中将学生答案标记为“不收敛”。在这些情况下,答案被标记为无效,因为无法确定它们是否正确。

为什么评分可能不收敛

pl-symbolic-input 问题元素使用 Python 库 SymPy 来表示和评分表达式。在评分过程中,正确答案和学生提交的内容被解析为 SymPy 表达式,然后使用库的内置相等检查器进行比较。

检查相等性并非易事,因为它考虑了广泛的数学等价性(例如,log(10*x) 被视为等于 log(10)+log(x),或 (x+1)**2 等于 x**2+2*x+1)。为了考虑等价规则的所有可能组合,SymPy 试探性地应用简化 并可能重复应用。不幸的是,这意味着相等检查器可能需要多长时间才能完成,并且在极少数情况下,它甚至可能陷入非终止的简化循环中。

ZJUI-Learn 在几秒钟后自动终止 SymPy 的相等性检查。此检查适用于两种情况。如果学生的提交导致超时,则该元素会在评分期间将学生提交的内容标记为无效。请注意,正确和错误的答案都可能会触发超时。学生会看到一条错误消息,告诉他们 Your answer did not converge, try a simpler expression.。如果需要,可以将此行为替换为问题的 server.py 文件 中的自定义评分代码。

添加additional-simplifications防止不收敛

终止 SymPy 的相等性检查是确保正常评分过程(包括 server.py 中定义的自定义问题评分)能够完成的最后手段。当出现不收敛错误时,学生可能会将其误解为问题有错误的信号,尽管即使对答案进行很小的更改(例如,手动扩展术语)也可能解决问题,并且正确答案很少会触发不收敛错误。

如果正确的答案和提交的答案具有相同的结构,SymPy 不太可能遇到问题。因此,作为一名讲师,可以通过“指导”SymPy 的相等性检查过程来防止超时。这可以通过向 SymPy 提供一系列简化步骤来实现,SymPy 在依赖其内置启发式方法之前应执行这些简化步骤。例如,trigsimp 简化步骤可以将 sin(x)/cos(x) 转换为 tan(x)expand 可以将 (x+1)**2 等表达式转换为 x**2+2*x+1

Warning

应用 additional-simplifications 并不能保证解决所有超时问题。特定问题的最佳简化顺序取决于问题的复杂性和领域(例如,是否使用三角函数)。如果问题遇到不收敛问题,更改预期答案可能比尝试此参数更容易。

下表列出了可以为属性 additional-simplifications 提供的可能的简化,并按列出的顺序应用:

简化 描述 示例
expand 展开多项式 (x + 1)**2 => x**2 + 2*x + 1
powsimp 电源简化 x**a*x**b => x**(a + b)
trigsimp 三角简化 sin(x)/cos(x) => tan(x)
expand_log 对数简化 log(x*y) => log(x) + log(y)

additional-simplifications 的一些成功使用的具体示例是:

  • (-8*x*sin(8*x)/cos(8*x) + log(cos(8*x)))*cos(8*x)**x受益于additional-simplifications="trigsimp"
  • 7**(x + 8)*log(7) 受益于additional-simplifications="expand"

Note

SymPy 的内置启发式算法已考虑上述所有简化,因此将它们列在 additional-simplifications 中不会影响表达式的显示或评分结果(除非发生超时)。另请注意,简化始终适用于正确答案和提交的答案,因为目标是增加它们的相似性(例如,两者都完全展开),而不是针对特定形式(例如,展开与因式分解)。