改良版

改良版

如何写出负系数的二次方程fp


对于 a=1、b=-5、c= 6,$\ca x^2+\cb x + \cc=0$ 得出1x^2 + -5x + 6

但我想要x^2 -5x + 6

\documentclass{beamer}
\usepackage{fp}
\begin{document}
\begin{frame}{Quadratic equation}
\FPset\ca{1}
\FPset\cb{-5}
\FPset\cc{6}
\FPqsolve\xone\xtwo\ca\cb\cc
\FPeval\xone{clip(round(xone:4))}
\FPeval\xtwo{clip(round(xtwo:4))}
Quadratic equation : $\ca x^2+\cb x + \cc=0$\\[1cm]
Result: $x = \xone \quad \text{and} \quad  x = \xtwo$
\end{frame}
\end{document}

答案1

需要进行一些比较。假设系数是整数。

\documentclass{beamer}
\usepackage{fp}

\newcommand{\quadratic}[4][x]{%
  \FPset\ca{#2}%
  \FPset\cb{#3}%
  \FPset\cc{#4}%
  \FPqsolve\xone\xtwo\ca\cb\cc
  \FPeval\xone{clip(round(xone:4))}%
  \FPeval\xtwo{clip(round(xtwo:4))}%
  Quadratic equation: $
  \ifnum\ca=1
  \else
    \ifnum\ca=-1
      -%
    \else
      \ca
    \fi
  \fi
  #1^2%
  \ifnum\cb=0
  \else
    \ifnum\cb>0
      +%
      \ifnum\cb=1
      \else
        \cb
      \fi
    \else
      \ifnum\cb=-1
        -%
      \else
        \cb
      \fi
    \fi
    #1%
  \fi
  \ifnum\cc=0
  \else
    \ifnum\cc>0
      +
    \fi
    \cc
  \fi
  $\\[\bigskipamount]
  Result: $#1=\xone$ and $#1=\xtwo$%
}

\begin{document}
\begin{frame}{Quadratic equation}

\quadratic{1}{-5}{6}

\bigskip

\quadratic[t]{2}{3}{1}

\bigskip

\quadratic{2}{0}{-8}

\end{frame}
\end{document}

expl3

\documentclass{beamer}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\quadratic}{O{x}mmm}
 {
  Quadratic~equation:~$
  \str_case:nnF { #2 }
   {
    {1}{}
    {-1}{-}
   }
   {#2}
   #1^{2}
  \str_case:nnF { #3 }
   {
    {0}{}
    {1}{+#1}
    {-1}{-#1}
   }
   { \fp_compare:nT { #3>0 } { + } #3#1 }
  \fp_compare:nF { #4 = 0 }
   {
    \fp_compare:nT { #4 > 0 } { + }
   }
  #4
  $\\[\bigskipamount]
  Result:~$#1=\sandu_solve:nnnn{+}{#2}{#3}{#4}$~and~
  $#1=\sandu_solve:nnnn{-}{#2}{#3}{#4}$
}
\cs_new:Nn \sandu_solve:nnnn
 {
  \fp_eval:n { round( ( -(#3) #1 sqrt((#3)^2-4*(#2)*(#4)) )/(2*(#2)), 4) }
 }
\ExplSyntaxOff

\begin{document}
\begin{frame}{Quadratic equation}

\quadratic{1}{-5}{6}

\bigskip

\quadratic[t]{2}{3}{1}

\bigskip

\quadratic{2}{0}{-8}

\end{frame}
\end{document}

解释3

答案2

\addterm -5x除预期外,还将与之合作\addterm\cb x

\addterm宏接受一个参数,将其展开一次,然后将其传递给\addtermaux\addtermaux定义将抓取参数的第一个标记并检查它是否为减号-字符。如果是,它将排版 a-和参数的其余部分。如果不是,它将查看第一个标记是否是字符+。如果是,它将排版 a+和参数的其余部分。如果上述两种情况都不适用,它将排版 a+和完整参数。

这样,无论\cc设置为6还是设置为 ,都会提供正确的输出+6

\documentclass{beamer}
\usepackage{fp}
\newcommand\addterm[1]{\expandafter\addtermaux#1\relax}
\def\addtermaux#1#2\relax{\ifx-#1-#2\else\ifx+#1+#2\else+#1#2\fi\fi}
\begin{document}
\begin{frame}{Quadratic equation}
\FPset\ca{1}
\FPset\cb{-5}
\FPset\cc{6}
\FPqsolve\xone\xtwo\ca\cb\cc
\FPeval\xone{clip(round(xone:4))}
\FPeval\xtwo{clip(round(xtwo:4))}
Quadratic equation : $\ca x^2 \addterm\cb x \addterm\cc=0$\\[1cm]
Result: $x = \xone \quad \text{and} \quad  x = \xtwo$
\end{frame}
\end{document}

在此处输入图片描述

答案3

编辑:请参见下面的改进版本。

注意[fragile]中的\begin{frame}。必需带有\FPifpos

\documentclass{beamer}
\usepackage{fp}
\begin{document}
\begin{frame}[fragile]{Quadratic equation}
\FPset\ca{1}
\FPset\cb{-5}
\FPset\cc{6}
\FPqsolve\xone\xtwo\ca\cb\cc
\FPeval\xone{clip(round(xone:4))}
\FPeval\xtwo{clip(round(xtwo:4))}
\FPeval\babs{clip(round(abs(cb):4))}
\FPeval\cabs{clip(round(abs(cc):4))}

Quadratic equation :  $\ca x^2$ \FPifpos\cb $+$ \else $-$ \fi $\babs x$ \FPifpos\cc $+$ \else $-$ \fi $\cabs=0$ %\\[1cm]

Result: $x = \xone \quad \text{and} \quad  x = \xtwo$


\end{frame}
\end{document}

在此处输入图片描述

改良版

此版本可以更好地处理特殊情况(当方程的某些系数变为 -1、1 或 0 时)。

由于fp's\FPqsolve不能处理无解的方程(它会发出错误),所以我的代码不能正确显示“x^2”和“x”项为空的方程(当编译器不停在错误处时,它会显示类似以下内容:二次方程:+6 = 0)。此代码仅适合于方程有实数解的情况使用。

\documentclass{beamer}
\usepackage{fp}
\begin{document}
\begin{frame}[fragile]{Quadratic equation}
\FPset\ca{1}
\FPset\cb{-5}
\FPset\cc{6}
\FPqsolve\xone\xtwo\ca\cb\cc
\FPeval\xone{clip(round(xone:4))}
\FPeval\xtwo{clip(round(xtwo:4))}
\FPeval\aabs{clip(round(abs(ca):4))}
\FPeval\babs{clip(round(abs(cb):4))}
\FPeval\cabs{clip(round(abs(cc):4))}
\newcommand{\signa}{\FPifneg\ca -\else\fi}
\newcommand{\positiveSignBWithA}{\FPifzero\ca \else +\fi} % if \ca is 0, no positive sign before the "x" term if cb is positive
\newcommand{\signb}{\FPifneg\cb -\else \positiveSignBWithA\fi}
\newcommand{\signc}{\FPifneg\cc -\else +\fi}
\newcommand{\coeffa}{\FPifeq\aabs1 \else\aabs\fi}
\newcommand{\coeffb}{\FPifeq\babs1 \else\babs\fi}
\newcommand{\polya}{\FPifzero\ca \else\signa\coeffa x^2\fi}
\newcommand{\polyb}{\FPifzero\cb \else\signb\coeffb x\fi}
\newcommand{\polyc}{\FPifzero\cc \else\signc\cabs\fi}

Quadratic equation : $\polya \polyb \polyc =0$ \\[1cm]

Result: $x = \xone \quad \text{and} \quad  x = \xtwo$

\end{frame}
\end{document}

在此处输入图片描述

相关内容