Advertisement
theosib

C++ dual numbers

Mar 25th, 2022
1,015
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.30 KB | None | 0 0
  1. #include <math.h>
  2.  
  3. struct Dual {
  4.     double r; // Real
  5.     double i; // Infinitesimal
  6.    
  7.     Dual() {}
  8.    
  9.     Dual(const Dual& x) {
  10.         r = x.r;
  11.         i = x.i;
  12.     }
  13.    
  14.     Dual(double a, double b) {
  15.         r = a;
  16.         i = b;
  17.     }
  18.    
  19.     Dual(double a) {
  20.         r = a;
  21.         i = 0;
  22.     }
  23.    
  24.     double real() {
  25.         return r;
  26.     }
  27.    
  28.     double inf() {
  29.         return i;
  30.     }
  31. };
  32.  
  33. Dual operator +(const Dual& p, const Dual& q) {
  34.     return Dual(p.r + q.r, p.i + q.i);
  35. }
  36.  
  37. Dual operator -(const Dual& p, const Dual& q) {
  38.     return Dual(p.r - q.r, p.i - q.i);
  39. }
  40.  
  41. Dual operator -(const Dual& p) {
  42.     return Dual(-p.r, -p.i);
  43. }
  44.  
  45. Dual conjugate(const Dual& p) {
  46.     return Dial(p.r, -p.i);
  47. }
  48.  
  49. Dual operator *(const Dual& p, const Dual& q) {
  50.     double r = p.r*q.r;
  51.     double i = p.i*q.r + q.i*p.r;
  52.     return Dual(r, i);
  53. }
  54.  
  55. Dual operator /(const Dual& p, const Dual& q) {
  56.     double r = p.r/q.r;
  57.     double i = (p.i*q.r - q.i*p.r) / (q.r*q.r);
  58.     return Dual(r, i);
  59. }
  60.  
  61. Dual pow(const Dual& p, const Dual& q) {
  62.     double a = pow(p.r, q.r-1);
  63.     double r = a * p.r;
  64.     double i = r * q.i * log(p.r) + a * q.r * p.i;
  65.     return Dual(r, i);
  66. }
  67.  
  68. Dual pow(const Dual& p, double n) {
  69.     double a = pow(p.r, n-1);
  70.     double r = a * n;
  71.     double i = p.i * n * a;
  72.     return Dual(r, i);
  73. }
  74.  
  75. Dual sqr(const Dual& p) {
  76.     return Dual(p.r*p.r, 2.0*p.r*p.i);
  77. }
  78.  
  79. Dual sqrt(const Dual& p) {
  80.     double r = sqrt(p.r);
  81.     double i = p.i / (2 * r);
  82.     return Dual(r, i);
  83. }
  84.  
  85. Dual recip(const Dual& p) {
  86.     double r = 1.0 / p.r;
  87.     double i = -p.i / (p.r * p.r);
  88.     return Dual(r, i);
  89. }
  90.  
  91. Dual exp(const Dual& p) {
  92.     double a = exp(p.r);
  93.     return Dual(a, a*p.i);
  94. }
  95.  
  96. Dual log(const Dual& p) {
  97.     return Dual(log(p.r), p.i/p.r);
  98. }
  99.  
  100. Dual sin(const Dual& p) {
  101.     double r = sin(p.r);
  102.     double i = p.i * cos(p.r);
  103.     return Dual(r, i);
  104. }
  105.  
  106. Dual cos(const Dual& p) {
  107.     double r = cos(p.r);
  108.     double i = -p.i * sin(p.r);
  109.     return Dual(r, i);
  110. }
  111.  
  112. Dual tan(const Dual& p) {
  113.     double r = tan(p.r);
  114.     double c = cos(p.r);
  115.     double i = p.i / (c*c);
  116.     return Dual(r, i);
  117. }
  118.  
  119. Dual sinh(const Dual& p) {
  120.     double r = sinh(p.r);
  121.     double i = p.i * cosh(p.r);
  122.     return Dual(r, i);
  123. }
  124.  
  125. Dual cosh(const Dual& p) {
  126.     double r = cosh(p.r);
  127.     double i = p.i * sinh(p.r);
  128.     return Dual(r, i);
  129. }
  130.  
  131. Dual tanh(const Dual& p) {
  132.     double r = tanh(p.r);
  133.     double c = cosh(p.r);
  134.     double i = p.i / (c*c);
  135.     return Dual(r, i);
  136. }
  137.  
  138. Dual arcsin(const Dual& p) {
  139.     double r = arcsin(p.r);
  140.     double i = p.i / sqrt(1 - p.r*p.r);
  141.     return Dual(r, i);
  142. }
  143.  
  144. Dual arccos(const Dual& p) {
  145.     double r = arccos(p.r);
  146.     double i = -p.i / sqrt(1 - p.r*p.r);
  147.     return Dual(r, i);
  148. }
  149.  
  150. Dual arctan(const Dual& p) {
  151.     double r = arctan(p.r);
  152.     double i = p.i / (1 + p.r*p.r);
  153.     return Dual(r, i);
  154. }
  155.  
  156. Dual arcsinh(const Dual& p) {
  157.     double r = arcsinh(p.r);
  158.     double i = p.i / sqrt(1 + p.r*p.r);
  159.     return Dual(r, i);
  160. }
  161.  
  162. Dual arccosh(const Dual& p) {
  163.     double r = arccosh(p.r);
  164.     double i = p.i / (sqrt(p.r - 1) * sqrt(p.r + 1));
  165.     return Dual(r, i);
  166. }
  167.  
  168. Dual arctanh(const Dual& p) {
  169.     double r = arctanh(p.r);
  170.     double i = p.i / (1 - p.r*p.r);
  171.     return Dual(r, i);
  172. }
  173.  
  174.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement