vak: (Default)
[personal profile] vak
В середине 80-х лучшим языком для символьного дифференцирования считался Рефал.
Diff  {
      (e.t) e.1 '+' e.2 = <Diff (e.t) e.1> '+' <Diff (e.t) e.2>;
      (e.t) e.1 '-' e.2 = <Diff (e.t) e.1> '-' <Diff (e.t) e.2>;
      (e.t) e.1 '*' e.2 = (e1 '*' <Diff (e.t) e.2>
                          '+' <Diff (e.t) e.1> '*' e.2);
      (e.t) (e.1)       = ( <Diff (e.t) e.1> );
      (e.t) e.t         = '1';
      (e.t) e.1         = '0';
}
Нынче Хаскель поинтереснее будет:
Dif a = D a (Dif a)

dConst :: Num a => a -> Dif a
dConst x0 = D x0 dZero
 
dZero :: Num a => Dif a
dZero = D 0 dZero

instance Num a => Num (Dif a) where
  fromInteger               = dConst . fromInteger
  D x0 x’ + D y0 y’         = D (x0 + y0) (x’ + y’)
  D x0 x’ - D y0 y’         = D (x0 - y0) (x’ - y’)
  x@(D x0 x’) * y@(D y0 y’) = D (x0 * y0) (x’ * y + x * y’)
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org