Trazar una parábola aleatoria en forma estándar y reescribirla en forma expandida

Trazar una parábola aleatoria en forma estándar y reescribirla en forma expandida

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 \NewDocumentCommandnombre \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, expl3este es el tipo de problema que el sagetexpaquete 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}

La salida en Cocalc es: ingrese la descripción de la imagen aquí

El código (Python) será más fácil de leer expl3y 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 sagetexpaquete 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 sagetexesaquí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}

información relacionada