pl-symbolic-input元件¶
填写允许输入数学符号的空白字段。
样品元素¶

<pl-symbolic-input answers-name="symbolic_math" variables="x, y" label="$z =$"></pl-symbolic-input>
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 |
布尔 | 假 | 是否允许复数(以i或j为虚数单位的表达式)。 |
allow-sets |
布尔 | 假 | 是否允许设置和间隔表示法。 更多详情请见下文。 |
allow-trig-functions |
布尔 | 真实 | 是否允许三角函数(cos、atanh,...)。 |
answers-name |
字符串 | — | 用于存储数据的变量名称。请注意,该属性在问题中必须是唯一的,即该属性的值不应在问题中重复。如果正确答案在 server.py 中设置为复杂对象,则应使用 import prairielearn as pl 和 data["correct_answers"][answers-name] = pl.to_json(ans)。 |
aria-label |
字符串 | — | 输入的可访问标签。 |
blank-value |
字符串 | 0 (zero) | 如果答案留空,则用作答案的表达式。仅当 allow-blank 为 true 时适用。必须是 ""(空字符串)或遵循与预期用户输入相同的格式(例如,相同的变量等)。 |
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" 时,学生可以在提交的答案中使用 i 和 j。 |
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。
与希腊字母同名的变量(例如 alpha、beta 等)将自动转换为其 LaTeX 等效项,以显示在正确答案和提交面板上。
如果是 allow-complex="true",请勿在 variables 列表中包含 i 或 j,并且不要在 variables 列表中包含任何其他保留名称(e、pi、cos、 sin等)。元素代码将检查(并禁止)variables、custom-functions 列表和保留名称之间的冲突。
请注意,在评估学生答案时,在正确答案中使用附加假设创建的变量将尊重这些假设。 有关详细信息,请参阅示例问题。
设置符号¶
如果是 allow-sets="true",则启用以下附加语法层:
- 设置具有显式列出成员的文字(例如
{1, 2, 3}、{0, 2pi/3, 4pi/3}、{ {}, { {} } }) - 间隔集合表示法,包括 $\infty$(例如
(-sin(x), +sin(x))、(-infty, 5]、[2, oo]) - 常用集合运算符:并集(
U、cup、+或|)、 交集(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 中不会影响表达式的显示或评分结果(除非发生超时)。另请注意,简化始终适用于正确答案和提交的答案,因为目标是增加它们的相似性(例如,两者都完全展开),而不是针对特定形式(例如,展开与因式分解)。