透過標準形式繪製隨機拋物線並以擴展形式重寫

透過標準形式繪製隨機拋物線並以擴展形式重寫

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

相關內容