概述
我的标题不是最好的,如果有更好的建议,我会修改它!简而言之,我想要实现的是随机改变数学问题中的数字,并找到一个适当“解决”该问题的解决方案。
我还在考虑解决方案中不仅仅使用 TeX - 使用其他语言(如 C++)来生成要由 pdflatex 编译的 tex 文件的解决方案也是可以的。最终目标是拥有一个自主系统。我所考虑的一个更简单的例子(在数学方面和不使用 LaTeX 方面)可以在这里找到:http://www.tutorfinder.com.au/maths/multiplication.php
最后,我已经有一个使用考试类的完整模板,我希望使用它。如果您的解决方案需要与考试类不兼容的包,请告诉我!
我目前的想法
纯 LaTeX 溶液
假设一个简单的问题是:
Solve $\intop 6\sin(2x)\, dx$
我希望展示的解决方案(需要 mathtools 包)是:
\begin{align*}
\shortintertext{\text{Recall from the formula sheet that:}}
\intop\sin(nx)\, dx & =-\frac{1}{n}\cos(nx)+C\\
\shortintertext{\text{Here, \ensuremath{n=2}}}
\therefore\intop6\sin(2x)\, dx & =6\times\left(-\frac{1}{2}\right)\cos(2x)+C\\
& =-3\cos(2x)+C
\end{align*}
有没有办法随机化22x 中,使其介于 1 和 4 之间,并随机化 6在 -2 到 10 之间的 sin(2x) 前面,这样每次编译 tex 文件时它都会发生变化?
然后,在哪里6\times\left(-\frac{1}{2}\right)
发生,这将被新随机数的乘积所取代?我正在考虑定义2和6作为变量,然后使用其中一个计算器包来查找乘积。不过,稍后我将需要 LaTeX 来解决更复杂的方程式,例如三角函数(例如 sin(0.4))、简单定积分(例如 x^3 从 0 到 1 的积分)、排列(例如 nCr、nPr、阶乘)和正态分布……
这是我的另一个想法:
使用其他程序生成 TeX 文件
因为我不知道 LaTeX 在生成随机数和进行计算方面的能力,所以我正在考虑使用另一种语言来计算相关系数,然后将其打印在带有相关标记的 tex 文件中。例如:
Program:
<a> = random integer between -2 and 10 (here: 6)
<b> = random integer between 1 and 4 (here: 2)
<c> = <a> / <b> (here: 6/2 = 3)
然后,它打印:
Solve $\intop <a> \sin(<b>x)\, dx$
\begin{align*}
\shortintertext{\text{Recall from the formula sheet that:}}
\intop\sin(nx)\, dx & =-\frac{1}{n}\cos(nx)+C\\
\shortintertext{\text{Here, \ensuremath{n=2}}}
\therefore\intop<a>\sin(<b>x)\, dx & =<a>\times\left(-\frac{1}{<b>}\right)\cos(<b>x)+C\\
& =-<c>\cos(<b>x)+C
\end{align*}
好处是,当需要解决积分或概率问题时,我知道会有一个库/工具箱/插件可以找到答案。此外,我知道语句等是否有效。
例如,抛物线可以有零个、一个或两个截距。我可以编写程序来确定判别式是什么,然后根据判别式的符号使用 if elseif 语句打印正确的结果。我不知道如何在 LaTeX 中做到这一点...
概括
我知道这是一篇很长的帖子,我深表歉意。因为我的问题比较具体,我不希望一些好心人花几个小时写出解决方案,结果却发现他们误解了我想要实现的目标。
我确实在寻找 LaTeX 中的包,它可以做我所寻找的事情并且可以在我的问题中实现;或者建议一种有效的方法来创建一个执行此操作的程序;或者其他一些比我现在的想法更有效的奇妙想法。
欢呼吧,Alwin
答案1
我最近正在寻找类似的方法,并且我的问题通过在我的文档中使用 lua 代码得到了解决。使用 LuaLaTeX 计算 TikZ 绘图中使用的长度(以厘米为单位)。在附加的代码中,我有一个关于磁性的问题,所有数字都是随机生成的,这将创建一个新的问题 + 答案。我还包含了一些用于四舍五入和格式化科学计数法的函数,这样我就可以使用这些数字进行 siunitx 显示以及进一步的计算。唯一的限制是,这需要用 LuaLaTeX 进行编译。
\documentclass{article}
\usepackage[binary-units]{siunitx}
\usepackage{luacode}
% shorthand command to define and set a variable as a length
\newcommand*{\nvar}[2]{%
\newcommand*{#1}{}
\edef#1{#2}
}
\newcommand*{\rvar}[2]{%
\renewcommand*{#1}{}
\edef#1{#2}
}
\begin{document}
\begin{luacode}
function round2(num, idp) -- rounding numbers to a defined number of decimal points
return tonumber(string.format("%." .. (idp or 0) .. "f", num))
end
function roundScientific(num, idp) -- rounding numbers to a defined number of decimal points
return string.format("%." .. (idp or 0) .. "e", num)
end
function magneticFieldStrengthH ( I,N,L, printStr ) -- function to calculate the magnetic field strength H with a given current I, number of turns N and length L
if printStr == true then
result= (tex.print(round2(I * N / L ,3 )) )
else
result = I * N / L
end
return result
end
function fluxDensityB(mu, H, printStr) -- function to calculate the flux density B with a given permittivity mu and magnetic field strength H
if printStr == true then
result = tex.print( roundScientific(mu * H,3) )
else
result = mu * H
end
return result
end
function totalFluxPhi( B,A,printStr ) -- function to calculate the total flux Phi with a given flux density B and cross-sectional area A
if printStr == true then
result = tex.print( roundScientific( B * A,3) )
else
result = B * A
end
return result
end
-- seed lua PRNG with os time
math.randomseed( os.time() )
\end{luacode}
%\nvar{\currentI}{4}
\nvar{\currentI}{\directlua{tex.print(math.random(1,10)) }}
%\nvar{\lengthL}{0.6}
\nvar{\lengthL}{ \directlua{tex.print(math.random(1,10)/10 ) } }
%\nvar{\turnsN}{200}
\nvar{\turnsN}{\directlua{tex.print(math.random(1,10) * 100) } }
%\nvar{\crossareaA}{500e-6}
\nvar{\crossareaA}{\directlua{tex.print( (math.random(1,10) * 100) .. "e-6" )}}
A coil of \turnsN\ turns is wound uniformly onto a wooden ring having a
mean circumference of \SI{\lengthL}{\metre} and a uniform cross sectional area of
\SI{\crossareaA}{\square\metre}. If the current through the coil is
\SI{\currentI}{\ampere} and $\mu = 4\pi \times 10^{-7}
\si{\weber\per\ampere\per\metre}$, calculate:
\begin{itemize}
\item Magnetic field strength. $\directlua{magneticFieldStrengthH(\currentI, \turnsN, \lengthL, true) } \frac{\si{\ampere}\text{ turns}}{\si{\metre}}$
\item Flux density. \SI{ \directlua{fluxDensityB(4e-7 * math.pi, magneticFieldStrengthH(\currentI, \turnsN, \lengthL,false),true ) } }{\weber\per\square\metre}
\item Total flux. \SI{\directlua{ totalFluxPhi(fluxDensityB(4e-7 * math.pi, magneticFieldStrengthH(\currentI, \turnsN, \lengthL,false),false ),\crossareaA,true) } }{\weber}
\end{itemize}
\end{document}
编辑
旧示例 MWE 每次使用宏时都会创建新值,即 \currentI、\lengthL 等。答案 (tex.print 的 LuaLaTeX 输出未被解释) 让我走上了正确的道路,因为我可以使用 \edef (\let 和 \edef 之间有什么区别?) 以确保 \directlua 仅扩展一次。我在 nvar 和 rvar 的定义中加入了对我的代码的调整
答案2
使用评论中提供的链接,我能够找到一种不需要外部程序的方法来回答我自己的问题:
\begin{questions}
%---
%\pgfmathsetseed{1}
\pgfmathtruncatemacro\coeffa{random(1,10)}
\pgfmathtruncatemacro\coeffb{random(2,8)}
\pgfmathtruncatemacro\coeffc{\coeffa/gcd(\coeffa,\coeffb)}
\pgfmathtruncatemacro\coeffd{\coeffb/gcd(\coeffa,\coeffb)}
%---
\question[2] Solve $\displaystyle \intop \coeffa \sin(\coeffb x)\, dx$
\begin{solutionorlines}[3\lines]
\begin{align*}
\shortintertext{\text{Recall from the formula sheet that:}}
\intop\sin(nx)\, dx & =-\frac{1}{n}\cos(nx)+C\\
\shortintertext{\text{Here, \ensuremath{n=\coeffb}}}
\therefore\intop \coeffa \sin(\coeffb x)\, dx & = \coeffa\times\left(-\frac{1}{\coeffb}\right)\cos(\coeffb x)+C\\
& =-\frac{\coeffc}{\coeffd}\cos(\coeffb x)+C
\end{align*}
\end{solutionorlines}
\end{questions}
它似乎确实需要一段时间来编译,所以我仍然会检查建议的其他方法,看看速度的提高是否值得增加复杂性。
欢呼吧,Alwin