標準形式でランダム放物線をプロットし、展開形式で書き直す

標準形式でランダム放物線をプロットし、展開形式で書き直す

の使用に関して、もう 1 つ質問がありますexpl3。ランダムな放物線を生成し、生成された方程式の書き換え形式を印刷しようとしています。 という\NewDocumentCommand名前のがあります\parabola。2 次方程式の標準形式のさまざまな係数に対応する、いくつかのグローバル変数を宣言しています。つまり、2 次方程式の標準形式は (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% 確信できません。文書の大部分をカットしたので、何かが足りないようであれば、コメントして教えてください。もう一度言いますが、私は制約を与えられた標準形式でランダムな 2 次方程式を生成し、その方程式をプロットし、そのプロットの下に方程式の展開形式をリストしようとしています。

答え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に強制的に渡すこともできます。このWebサイトには、その方法を示す例が多数あります。私の回答ここそしてこここれらは、多くの例のうちの2つにすぎません。この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}

関連情報