如何写出负系数的二次方程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}
答案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}