编程阶跃函数

编程阶跃函数

我有 7 个按递增顺序排列的值,a_0,a_1,...,a_6我想在极值的区间上编写一个阶跃函数a_i,因此函数 f 使得,

f(x)=f_0 on [a_0,a_1[, f_1 on [a_1,a_2[..., f_5 on [a_5,a_6[

我的情况的程序为每个实数给出了 f 的值。在 latex 上执行此操作的最简单方法是什么?.. 我认为这是个简单的程序,类似循环之类的东西\multido可以完成这项工作,例如使用ifthen包,但我不熟悉 LaTeX 编程。. 我不知道如何声明变量序列并为这些变量赋值。

对我来说,理想的情况是获得一个宏\Step{\alpha,a_i,a_{i+1}},当f_{i}条件满足时

  {a_i\leq\alpha<a_{i+1}}

是正确的,对于几个值\alpha...谢谢

答案1

有以下可能性:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\definestepfunction}{mmm}
 { % #1 is the function's name
   % #2 is the semicolon separated subdivision
   % #3 is the semicolon separated list of values
  \faouzi_step_define:nnn { #1 } { #2 } { #3 }
 }

\cs_new_protected:Nn \faouzi_step_define:nnn
 {
  \tl_clear:N \l_faouzi_step_temp_tl
  \seq_set_split:Nnn \l_faouzi_step_division_seq { ; } { #2 }
  \seq_set_split:Nnn \l_faouzi_step_values_seq { ; } { #3 }
  \int_step_inline:nnnn { 1 } { 1 } { \seq_count:N \l_faouzi_step_division_seq - 1 }
   {
    \tl_put_right:Nx \l_faouzi_step_temp_tl
     {
      \exp_not:N \faouzi_step_compare:nnnn { ########1 }
       { \seq_item:Nn \l_faouzi_step_division_seq { ##1 } }
       { \seq_item:Nn \l_faouzi_step_division_seq { ##1 + 1 } }
       { \seq_item:Nn \l_faouzi_step_values_seq { ##1 } }
     }
   }
  \cs_new:cV { faouzi_step_ \cs_to_str:N #1 :n } \l_faouzi_step_temp_tl
  \cs_new_eq:Nc { #1 } { faouzi_step_ \cs_to_str:N #1 :n }
 }

\cs_generate_variant:Nn \cs_new:cn { cV }

\cs_new:Nn \faouzi_step_compare:nnnn
 {
  \fp_compare:nT { #2 <= #1 < #3 } { #4 }
 }

\ExplSyntaxOff

\definestepfunction{\test}{0;1;2;3}{a;b;c}

\begin{document}

Should be a: \test{0}\par
Should be a: \test{0.2}\par
Should be b: \test{1}\par
Should be b: \test{1.99999}\par
Should be c: \test{2}\par
Should be c: \test{2.3}\par

\end{document}

构建宏的\test目的是对其参数进行比较,如果参数适合其中一个子区间,则传递该值。

如果参数不在域中,则不返回任何内容。可以针对这种情况添加错误检查。

请注意,值可以是任意标记。

在此处输入图片描述

带有错误检查的版本:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\definestepfunction}{mmm}
 { % #1 is the function's name
   % #2 is the semicolon separated subdivision
   % #3 is the semicolon separated list of values
  \faouzi_step_define:nnn { #1 } { #2 } { #3 }
 }

\cs_new_protected:Nn \faouzi_step_define:nnn
 {
  \tl_clear:N \l_faouzi_step_temp_tl
  \seq_set_split:Nnn \l_faouzi_step_division_seq { ; } { #2 }
  \seq_set_split:Nnn \l_faouzi_step_values_seq { ; } { #3 }
  \int_step_inline:nnnn { 1 } { 1 } { \seq_count:N \l_faouzi_step_division_seq - 1 }
   {
    \tl_put_right:Nx \l_faouzi_step_temp_tl
     {
      \exp_not:N \faouzi_step_compare:nnnn { ########1 }
       { \seq_item:Nn \l_faouzi_step_division_seq { ##1 } }
       { \seq_item:Nn \l_faouzi_step_division_seq { ##1 + 1 } }
       { \seq_item:Nn \l_faouzi_step_values_seq { ##1 } }
     }
   }
  \cs_new:cV { faouzi_step_ \cs_to_str:N #1 _aux:n } \l_faouzi_step_temp_tl
  \cs_new:cx { faouzi_step_ \cs_to_str:N #1 :n }
   {
    \exp_not:N \faouzi_step_check:nnnn
     { \cs_to_str:N #1 }
     { ##1 }
     { \seq_item:Nn \l_faouzi_step_division_seq { 1 } }
     { \seq_item:Nn \l_faouzi_step_division_seq { -1 } }
   }
  \cs_new_eq:Nc { #1 } { faouzi_step_ \cs_to_str:N #1 :n }
 }

\cs_generate_variant:Nn \cs_new:cn { cV }

\cs_new:Nn \faouzi_step_compare:nnnn
 {
  \fp_compare:nT { #2 <= #1 < #3 } { #4 }
 }
\cs_new:Nn \faouzi_step_check:nnnn
 {
  \fp_compare:nTF { #3 <= #2 < #4 }
   {
    \use:c { faouzi_step_#1_aux:n } { #2 }
   }
   {
    \msg_error:nnnnn { faouzi/step } { out-of-bounds } { #2 } { #3 } { #4 }
   }
 }

\msg_new:nnnn { faouzi/step } { out-of-bounds }
 {% error message
  Value~#1~out~of~bounds~[#2,#3)
 }
 {% help message
  The~given~value~'#1'~is~out~of~bounds,~the~function~
  is~defined~in~the~interval~[#2,#3)
 }

\ExplSyntaxOff

\definestepfunction{\test}{0;1;2;3}{a;b;c}

\begin{document}

Should be a: \test{0}\par
Should be a: \test{0.2}\par
Should be b: \test{1}\par
Should be b: \test{1.99999}\par
Should be c: \test{2}\par
Should be c: \test{2.3}\par
Gives error: \test{-1}\par
Gives error: \test{3}\par
Gives error: \test{3.1}\par

\end{document}

相关内容