Trace uma parábola aleatória via forma padrão e reescreva na forma expandida

Trace uma parábola aleatória via forma padrão e reescreva na forma expandida

Tenho outra dúvida em relação ao uso do expl3. Estou tentando gerar uma parábola aleatória e depois imprimir uma forma reescrita dessa equação gerada. Eu tenho um \NewDocumentCommandnome \parabola. Tenho algumas variáveis ​​globais declaradas que correspondem a diferentes coeficientes na forma padrão de uma quadrática. Ou seja, para a forma padrão de uma quadrática dada por: (A/D)(xh)^2+k. Onde A é um número inteiro em [-2,2]\{0}, D é um número inteiro em [1,5] e h e k são números inteiros em [-2,2]. Além disso, gostaria de uma seção que assumisse o formato padrão que uso para plotar e o escrevesse em formato expandido (ou seja, ax^2+bx+c). Esta parte certamente estou perdido em realizar. Meu preâmbulo é fornecido e os documentos são fornecidos abaixo:

\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}

Há muitas linhas desnecessárias ali, pois faz parte de um documento maior, e não posso ter 100% de certeza de quais partes são necessárias para minha seção. Cortei a maior parte do documento, então se parecer que estou faltando alguma coisa, comente e me diga. Novamente, estou tentando gerar uma equação quádrica aleatória na forma padrão, dadas as restrições, traçar essa equação e, em seguida, listar a forma expandida da equação abaixo do gráfico.

Responder1

Se você não insiste, expl3esse é o tipo de problema que o sagetexpacote facilita. Considere o seguinte 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}

A saída no Cocalc é: insira a descrição da imagem aqui

O código (Python) será mais fácil de ler expl3e você pode ver que não há muito dele. Forneci um gráfico usando SAGE, mas você pode forçar a saída para tikz/pgfplots. Existem vários exemplos neste site para mostrar como. Minhas respostasaquieaquisendo apenas dois de muitos exemplos. O sagetexpacote usa um sistema de álgebra computacional para fazer sua mágica, de modo que a expansão da forma de vértice para a forma padrão é realizada por g = expand(f). A documentação para sagetexéaquino CTAN. O CAS é SAGE, seu site éaqui. Ele não vem com LaTeX, então você precisará instalá-lo em seu computador. Como isso pode ser problemático dependendo da sua plataforma, um aplicativo gratuitoCocalcconta é a melhor maneira de começar. Então você não precisa do SAGE no seu computador porque você obtém acesso através da nuvem.

Responder2

Se você quiser saber mais sobre o LaTeX3, você pode consultar otutorialque eu escrevi.

\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}

informação relacionada