
Tengo otra pregunta con respecto al uso expl3
. Estoy intentando generar una parábola aleatoria y luego imprimir una forma reescrita de esa ecuación generada. Tengo un \NewDocumentCommand
nombre \parabola
. Tengo algunas variables globales declaradas que corresponden a diferentes coeficientes en forma estándar de cuadrática. Es decir, para la forma estándar de una cuadrática dada por: (A/D)(xh)^2+k. Donde A es un número entero en [-2,2]\{0}, D es un número entero en [1,5] y h y k son números enteros en [-2,2]. Además de esto, me gustaría una sección que tome la forma estándar que uso para trazar y la escriba en forma expandida (es decir, ax^2+bx+c). Ciertamente estoy perdido en lograr esta parte. Mi preámbulo se proporciona y el documento se proporciona a continuación:
\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}
Hay muchas líneas innecesarias porque es parte de un documento más grande y no puedo estar 100% seguro de qué partes son necesarias para mi sección. Recorté la mayor parte del documento, así que si parece que me falta algo, comenta y dímelo. Nuevamente, estoy tratando de generar una ecuación cuádrica aleatoria en forma estándar, dadas las restricciones, trazar esa ecuación y luego enumerar la forma expandida de la ecuación debajo de la gráfica.
Respuesta1
Si no insiste, expl3
este es el tipo de problema que el sagetex
paquete facilita. Considere el siguiente código:
\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}
El código (Python) será más fácil de leer expl3
y puedes ver que no hay mucho. He proporcionado un gráfico usando SAGE, pero puedes forzar la salida a tikz/pgfplots. Hay numerosos ejemplos en este sitio web para mostrar cómo hacerlo. Mis respuestasaquíyaquísiendo sólo dos de muchos ejemplos. El sagetex
paquete utiliza un sistema de álgebra computacional para hacer su magia, de modo que la expansión desde la forma de vértice a la forma estándar se logra mediante g = expand(f)
. La documentación para sagetex
esaquíen CTAN. El CAS es SAGE, su sitio web esaquí. No viene con LaTeX, por lo que deberás instalarlo en tu computadora. Como eso puede ser problemático dependiendo de su plataforma, un gratuitococalLa cuenta es la mejor manera de comenzar. Entonces no necesitas SAGE en tu computadora porque obtienes acceso a través de la nube.
Respuesta2
Si desea saber más sobre LaTeX3, puede consultar eltutorialque escribí.
\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}