关于使用,我还有一个问题expl3
。我试图生成一个随机抛物线,然后打印该生成方程的重写形式。我有一个\NewDocumentCommand
名为\parabola
。我声明了一些全局变量,它们对应于二次方程标准形式的不同系数。即,二次方程的标准形式由以下公式给出:(A/D)(xh)^2+k。其中 A 是 [-2,2]\{0} 中的整数,D 是 [1,5] 中的整数,h 和 k 是 [-2,2] 中的整数。除此之外,我想要一个部分,它采用我用于绘图的标准形式并将其写成展开形式(即 ax^2+bx+c)。这部分我肯定无法完成。我的序言如下,文档如下:
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[margin=0.75in]{geometry}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage{amsmath,amssymb,enumitem}
\usepackage[first=-20, last=20]{lcg}
\usepackage{tikz}
\usepackage{tkz-euclide}
\usepackage{calculator}
\usepackage{calculus}
\usepackage{ifthen}
\usepackage{xfp}
\usepackage{pgffor}
\usepackage{pgfplots}
\newcommand{\randi}{\rand\arabic{rand}}
\ExplSyntaxOn\newcommand{\intR}[2]{\chgrand[first=#1, last=#2] \randi}\ExplSyntaxOff
\ExplSyntaxOn\newcommand{\firstpower}{\chgrand[first=2, last=5] \randi}\ExplSyntaxOff
\ExplSyntaxOn\def\isneg#1{
\expandafter\ifnum#1>0 ~+\else ~-\fi
}\ExplSyntaxOff
\ExplSyntaxOn\def\isopp#1{
\expandafter\ifnum#1>0 ~-\else ~+\fi
}\ExplSyntaxOff
\ExplSyntaxOn\def\isone#1{
\expandafter\ifnum#1=1 ~1\else ~2\fi
}\ExplSyntaxOff
\newcommand{\addsub}{\pgfmathrandomitem{\choice}{choices1}\choice}
\pgfmathdeclarerandomlist{choices1}{{+}{-}}
\newcommand{\subnone}{\pgfmathrandomitem{\choice}{choices3}\choice}
\pgfmathdeclarerandomlist{choices3}{{}{-}}
\pgfplotsset{ every non boxed x axis/.append style={x axis line style=-}, every non boxed y axis/.append style={y axis line style=-}}
\NewDocumentCommand{\parabola}{}{
\int_gset:Nn \g_point_num_int { \int_rand:nn { -2 } { 2 } }
\int_gset:Nn \g_point_denom_int { \int_rand:nn { 1 } { 5 } }
\int_gset:Nn \g_point_xv_int { \int_rand:nn { -2 } { 2 } }
\int_gset:Nn \g_point_yv_int { \int_rand:nn { -2 } { 2 } }
\begin{tikzpicture}
\begin{axis}[
width=0.7\textwidth,
height=0.7\textwidth,
grid=major,
xmin=-5,
xmax=5,
ymin=-5,
ymax=5,
axis~lines=center
% axis lines = left
]
\addplot[smooth, red, thick] {(\g_point_num_int / \g_point_denom_int)*(x-\g_point_xv_int)^2+\g_point_yv_int};
\end{axis}
\end{tikzpicture}
}
\int_new:N \l_val_An_int
\int_new:N \l_val_Bn_int
\int_new:N \l_val_Cn_int
\int_new:N \l_val_Ad_int
\int_new:N \l_val_Bd_int
\int_new:N \l_val_Cd_int
\NewDocumentCommand{\paraexpand}{}{
% Writing expression for the A coefficient
\MULTIPLY{ \int_gset:N \g_point_num_int }{ 1 }{\tempNum}~
\MULTIPLY{ \int_gset:N \g_point_denom_int }{ 1 }{\tempDenom}~
\FRACTIONSIMPLIFY{ \tempNum }{ \tempDenom }{\An}{\Ad}
\ABSVALUE{ \An }\absAn~
\int_if_odd:nTF \isone{\Ad} {
\int_if_odd:nTF \isone{\absAn} {} {\int_set:Nn \l_val_A_int {\absAn} } } { \FRACTIONSIMPLIFY{\absAn}{\Ab}{}{} }
% Writing expression for numerator of B coefficient
\MULTIPLY{ \int_gset:N \g_point_xv_int }{ 2 }{\tempB}~
\MULTIPLY{ \tempB }{ \tempNum }{\solBn}~
\FRACTIONSIMPLIFY{ \solBn }{ \tempDenom }{\Bn}{\Bd}~
\ABSVALUE{ \Bn }\absBn~
% Writing expression for numerator of C coefficient
\SQUARE{ \g_point_xv_int }{ \hsq }~
\MULTIPLY{ \tempNum }{ \hsq }{\tempCl}~
\MULTIPLY{ \tempDenom }{ \int_gset:N \g_point_yv_int }{\tempCr}~
\ADD{ \tempCl }{ \tempCr }{\solCn}~
\FRACTIONSIMPLIFY{ \solCn }{ \tempDenom }{\Cn}{\Cd}~
\ABSVALUE{ \Cn }\absCn~
\if_odd:nTF \isone{}
$
\solA x^2
\isopp{\solB} \absB x
\isneg{\solC} \absC
$
}
\ExplSyntaxOff
\begin{document}
\newpage
\section*{Problem 7}
\begin{center}
\parabola
\end{center}
\paraexpand
\end{document}
由于它是一份较大文档的一部分,因此其中有很多不必要的行,我无法 100% 确定其中哪些部分是我的部分所必需的。我删掉了大部分文档,因此如果我遗漏了某些内容,请发表评论并告诉我。再次说明,我尝试生成标准形式的随机二次方程,给定约束,绘制该方程,然后在图下方列出方程的展开形式。
答案1
如果你不坚持的话,expl3
这个包可以让你轻松解决这类问题sagetex
。考虑以下代码:
\documentclass{article}
\usepackage{sagetex}
\begin{document}
\begin{sagesilent}
A = 0
while A == 0:
A = randint(-2,3)
D = randint(-1,5)
h = randint(-2,2)
k = randint(-2,2)
f = (A/D)*(x-h)^2+k
parab = plot(f,-4,4,color='red')
g = expand(f)
\end{sagesilent}
If $A=\sage{A}$, $D=\sage{D}$, $h=\sage{h}$, and $k=\sage{k}$ then the
function $f(x)=\frac{A}{D}(x-h)^2+k$ can be written as
$f(x)= \frac{\sage{A}}{\sage{D}}(x-(\sage{h}))^2+(\sage{k})$ or
$f(x)=\sage{f}$. Its graph is a parabola:
\begin{center}
\sageplot[width=3.5in]{parab}
\end{center}
The standard form of the parabola is $\sage{g}$.
\end{document}
代码(Python)将比expl3
而且你会发现代码并不多。我使用 SAGE 给出了一个图,但你可以强制将输出传递到 tikz/pgfplots。这个网站上有很多例子来说明如何操作。我的答案这里和这里只是众多例子中的两个。该sagetex
包使用计算机代数系统来发挥其魔力,因此从顶点形式到标准形式的扩展是通过 实现的g = expand(f)
。sagetex
是这里在 CTAN 上。CAS 是 SAGE,其网站是这里。它不附带 LaTeX,因此您需要在计算机上安装它。由于这可能会出现问题(具体取决于您的平台),因此免费可钙帐户是开始使用的最佳方式。然后您无需在计算机上安装 SAGE,因为您可以通过云进行访问。
答案2
如果你想了解更多关于 LaTeX3 的信息,可以参考教程我写的。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{expl3}
\ExplSyntaxOn
% https://tex.stackexchange.com/questions/253693/reducing-fractions-automatically-using-latex-3
\cs_set:Npn \svend_gcd:nn #1#2 {
\int_compare:nNnTF {#2} = { 0 } {#1}
{ \svend_gcd:ff {#2} { \int_mod:nn {#1} {#2} } }
}
\cs_generate_variant:Nn \svend_gcd:nn { ff }
\int_new:N \l__svend_tmp_int
\cs_set:Npn \svend_reduced:nnNN #1#2#3#4 {
\int_set:Nn \l__svend_tmp_int { \svend_gcd:nn {#1} {#2} }
\int_set:Nn #3 { \int_eval:n { #1 / \l__svend_tmp_int } }
\int_set:Nn #4 { \int_eval:n { #2 / \l__svend_tmp_int } }
}
\int_new:N \g_pb_a_int
\int_new:N \g_pb_d_int
\int_new:N \g_pb_h_int
\int_new:N \g_pb_k_int
\newcommand{\newparabola}{
\int_gset:Nn \g_pb_a_int {(2 * \int_rand:nn {0}{1} - 1) * \int_rand:nn {1}{2}}
\int_gset:Nn \g_pb_d_int {\int_rand:nn {1}{5}}
\int_gset:Nn \g_pb_h_int {\int_rand:nn {-2}{2}}
\int_gset:Nn \g_pb_k_int {\int_rand:nn {-2}{2}}
}
\cs_set:Npn \doc_int_safe_use:N #1 {
\int_compare:nNnT {#1} < {0} {
\int_use:N #1
}
\int_compare:nNnT {#1} > {0} {
+ \int_use:N #1
}
}
\int_new:N \l_tmpc_int
\int_new:N \l_tmpd_int
\int_new:N \l_tmpe_int
\cs_set:Npn \doc_frac_safe_output:nnnn #1#2#3#4 {
% extract sign
\int_set:Nn \l_tmpe_int {(#1) * (#2)}
\int_set:Nn \l_tmpa_int {\int_abs:n {#1}}
\int_set:Nn \l_tmpb_int {\int_abs:n {#2}}
\svend_reduced:nnNN {\l_tmpa_int} {\l_tmpb_int} \l_tmpc_int \l_tmpd_int
\str_case:nn {#3} {
{f} {
\int_compare:nNnT {\l_tmpe_int} < {0} {-}
\int_compare:nNnT {\l_tmpe_int} > {0} {+}
}
{n} {
\int_compare:nNnT {\l_tmpe_int} < {0} {-}
}
}
\int_compare:nNnT {\l_tmpc_int} = {0} {
\int_set:Nn \l_tmpd_int {1}
}
\int_compare:nNnTF {\l_tmpd_int} = {1} {
\str_case:nn {#4} {
{a} {
\int_use:N \l_tmpc_int
}
{z} {
\int_compare:nNnF {\l_tmpc_int} = {0} {
\int_use:N \l_tmpc_int
}
}
{n} {
\int_compare:nNnF {\l_tmpc_int} = {1} {
\int_use:N \l_tmpc_int
}
}
}
} {
\frac{\int_use:N \l_tmpc_int}{\int_use:N \l_tmpd_int}
}
}
% original parabola
\newcommand{\parabolao}{
\int_compare:nNnTF {\g_pb_h_int} = {0} {
$
\doc_frac_safe_output:nnnn {\g_pb_a_int} {\g_pb_d_int} {n} {n}
x^2 \doc_int_safe_use:N \g_pb_k_int
$
} {
$
\doc_frac_safe_output:nnnn {\g_pb_a_int} {\g_pb_d_int} {n} {n}
(x \doc_int_safe_use:N \g_pb_h_int )^2 \doc_int_safe_use:N \g_pb_k_int
$
}
}
% expanded parabola
\newcommand{\parabolae}{
\int_compare:nNnTF {\g_pb_h_int} = {0} {
$
\doc_frac_safe_output:nnnn {\g_pb_a_int} {\g_pb_d_int} {n} {n} x^2
\exp_args:Nx \doc_frac_safe_output:nnnn {\int_eval:n {
\g_pb_h_int * \g_pb_h_int * \g_pb_a_int + \g_pb_d_int * \g_pb_k_int}
} {\g_pb_d_int} {f} {a}
$
} {
$
\doc_frac_safe_output:nnnn {\g_pb_a_int} {\g_pb_d_int} {n} {n} x^2
\exp_args:Nx \doc_frac_safe_output:nnnn {\int_eval:n {2 * \g_pb_h_int * \g_pb_a_int}} {\g_pb_d_int} {f} {n} x
\exp_args:Nx \doc_frac_safe_output:nnnn {\int_eval:n {
\g_pb_h_int * \g_pb_h_int * \g_pb_a_int + \g_pb_d_int * \g_pb_k_int}
} {\g_pb_d_int} {f} {z}
$
}
}
% plot parabola
\newcommand{\parabolap}{
\begin{tikzpicture}
\begin{axis}[
width=0.7\textwidth,
height=0.7\textwidth,
grid=major,
xmin=-5,
xmax=5,
ymin=-5,
ymax=5,
axis~lines=center
]
\addplot[smooth, red, thick] {(\g_pb_a_int / \g_pb_d_int)*(x-\g_pb_h_int)^2+x-\g_pb_k_int};
\end{axis}
\end{tikzpicture}
}
\ExplSyntaxOff
\begin{document}
\newparabola
\par\parabolao
\par\parabolae
\begin{center}
\parabolap
\end{center}
\end{document}