
我還有一個關於使用的問題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}