Построить случайную параболу с помощью стандартной формы и переписать ее в развернутом виде.

Построить случайную параболу с помощью стандартной формы и переписать ее в развернутом виде.

У меня есть еще один вопрос относительно использования 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}

Вывод в Cocalc: введите описание изображения здесь

Код (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}

Связанный контент