概述

概述

概述

我的标题不是最好的,如果有更好的建议,我会修改它!简而言之,我想要实现的是随机改变数学问题中的数字,并找到一个适当“解决”该问题的解决方案。

我还在考虑解决方案中不仅仅使用 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)发生,这将被新随机数的乘积所取代?我正在考虑定义26作为变量,然后使用其中一个计算器包来查找乘积。不过,稍后我将需要 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

相关内容