%!TEX lualatex
\documentclass[french,a4paper,11pt]{article}
\usepackage[margin=1.5cm]{geometry}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{amsmath,amssymb,amstext}
\usepackage{mathtools}
\usepackage{ifthen}
\usepackage{xintexpr}
\usepackage{xinttools}
\usepackage{xstring}
\usepackage{simplekv}
\usepackage{babel}
\begin{document}
\section{Test de résolution d'une équation par balayage}
\defKV[SolBalay]{%
Precision=\def\BALAYstep{#1},%
ValeurInit=\def\BALAYxinit{#1}
}
\setKVdefault[SolBalay]{%
Precision=2,%
ValeurInit=0
}
\NewDocumentCommand\SolutionBalayage{ O{} m O{masolution} }{%1=options,2=equation,3=macro
\useKVdefault[SolBalay]%
\setKV[SolBalay]{#1}%
%extraction fonction + valeur
\StrCut{#2}{=}{\SolBalFCT}{\SolBalVal}%
%création des variables temporaires
\xintdeffloatfunc varfct(x) := \SolBalFCT ;%
\xdef\vartmp{\fpeval{\BALAYxinit}}%
\xdef\varstep{\fpeval{1e-\BALAYstep}}%
\whiledo{ \xintGt{\xintfloateval{(varfct(\vartmp)-\SolBalVal)*(varfct(\vartmp+\varstep)-\SolBalVal)}}{0} = 1}%
{%
\xdef\vartmp{\xintfloateval{\vartmp+\varstep}}%
}%
%création des variables
\expandafter\def\csname #3d\endcsname{\fpeval{\vartmp}}%
\expandafter\def\csname #3e\endcsname{\fpeval{\vartmp+\varstep}}%
\xintifboolexpr{\xintGt{\xintfloateval{abs(varfct(\vartmp)-\SolBalVal)}}{\xintfloateval{abs(varfct(\vartmp+\varstep)-\SolBalVal)}}{0}==1}%écardéfaut > écartexcès
{\expandafter\def\csname #3a\endcsname{\fpeval{\vartmp+\varstep}}}%
{\expandafter\def\csname #3a\endcsname{\fpeval{\vartmp}}}%
}
\SolutionBalayage[Precision=2]{x**3-2*x**2-x-1=2}
Une valeur approchée, à $10^{-2}$ près, d'une solution de $x^3-2x^2-x-1=2$ est $x_0$ avec :
\begin{itemize}
\item $x_0 \approx \masolutiond$ par défaut ;
\item $x_0 \approx \masolutione$ par excès ;
\item $x_0 \approx \masolutiona$.
\end{itemize}
\end{document}