Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <math.h>
- struct Dual {
- double r; // Real
- double i; // Infinitesimal
- Dual() {}
- Dual(const Dual& x) {
- r = x.r;
- i = x.i;
- }
- Dual(double a, double b) {
- r = a;
- i = b;
- }
- Dual(double a) {
- r = a;
- i = 0;
- }
- double real() {
- return r;
- }
- double inf() {
- return i;
- }
- };
- Dual operator +(const Dual& p, const Dual& q) {
- return Dual(p.r + q.r, p.i + q.i);
- }
- Dual operator -(const Dual& p, const Dual& q) {
- return Dual(p.r - q.r, p.i - q.i);
- }
- Dual operator -(const Dual& p) {
- return Dual(-p.r, -p.i);
- }
- Dual conjugate(const Dual& p) {
- return Dial(p.r, -p.i);
- }
- Dual operator *(const Dual& p, const Dual& q) {
- double r = p.r*q.r;
- double i = p.i*q.r + q.i*p.r;
- return Dual(r, i);
- }
- Dual operator /(const Dual& p, const Dual& q) {
- double r = p.r/q.r;
- double i = (p.i*q.r - q.i*p.r) / (q.r*q.r);
- return Dual(r, i);
- }
- Dual pow(const Dual& p, const Dual& q) {
- double a = pow(p.r, q.r-1);
- double r = a * p.r;
- double i = r * q.i * log(p.r) + a * q.r * p.i;
- return Dual(r, i);
- }
- Dual pow(const Dual& p, double n) {
- double a = pow(p.r, n-1);
- double r = a * n;
- double i = p.i * n * a;
- return Dual(r, i);
- }
- Dual sqr(const Dual& p) {
- return Dual(p.r*p.r, 2.0*p.r*p.i);
- }
- Dual sqrt(const Dual& p) {
- double r = sqrt(p.r);
- double i = p.i / (2 * r);
- return Dual(r, i);
- }
- Dual recip(const Dual& p) {
- double r = 1.0 / p.r;
- double i = -p.i / (p.r * p.r);
- return Dual(r, i);
- }
- Dual exp(const Dual& p) {
- double a = exp(p.r);
- return Dual(a, a*p.i);
- }
- Dual log(const Dual& p) {
- return Dual(log(p.r), p.i/p.r);
- }
- Dual sin(const Dual& p) {
- double r = sin(p.r);
- double i = p.i * cos(p.r);
- return Dual(r, i);
- }
- Dual cos(const Dual& p) {
- double r = cos(p.r);
- double i = -p.i * sin(p.r);
- return Dual(r, i);
- }
- Dual tan(const Dual& p) {
- double r = tan(p.r);
- double c = cos(p.r);
- double i = p.i / (c*c);
- return Dual(r, i);
- }
- Dual sinh(const Dual& p) {
- double r = sinh(p.r);
- double i = p.i * cosh(p.r);
- return Dual(r, i);
- }
- Dual cosh(const Dual& p) {
- double r = cosh(p.r);
- double i = p.i * sinh(p.r);
- return Dual(r, i);
- }
- Dual tanh(const Dual& p) {
- double r = tanh(p.r);
- double c = cosh(p.r);
- double i = p.i / (c*c);
- return Dual(r, i);
- }
- Dual arcsin(const Dual& p) {
- double r = arcsin(p.r);
- double i = p.i / sqrt(1 - p.r*p.r);
- return Dual(r, i);
- }
- Dual arccos(const Dual& p) {
- double r = arccos(p.r);
- double i = -p.i / sqrt(1 - p.r*p.r);
- return Dual(r, i);
- }
- Dual arctan(const Dual& p) {
- double r = arctan(p.r);
- double i = p.i / (1 + p.r*p.r);
- return Dual(r, i);
- }
- Dual arcsinh(const Dual& p) {
- double r = arcsinh(p.r);
- double i = p.i / sqrt(1 + p.r*p.r);
- return Dual(r, i);
- }
- Dual arccosh(const Dual& p) {
- double r = arccosh(p.r);
- double i = p.i / (sqrt(p.r - 1) * sqrt(p.r + 1));
- return Dual(r, i);
- }
- Dual arctanh(const Dual& p) {
- double r = arctanh(p.r);
- double i = p.i / (1 - p.r*p.r);
- return Dual(r, i);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement