Little fix after the last commit (mostly a git fail)
[eigenmath-fx.git] / laplace.cpp
blob28a160e036738d9efcdf31910ebbaf0d953b8763
1 // Laplace transform
3 #include "stdafx.h"
4 #include "defs.h"
6 void
7 eval_laplace(void)
9 push(cadr(p1));
10 eval();
11 push(symbol(SYMBOL_T));
12 laplace();
15 #define F p3
16 #define T p4
17 #define A p5
19 void
20 laplace(void)
22 int h;
23 save();
25 T = pop();
26 F = pop();
28 // L[f + g] = L[f] + L[g]
30 if (car(F) == symbol(ADD)) {
31 p1 = cdr(F);
32 h = tos;
33 while (iscons(p1)) {
34 push(car(p1));
35 push(T);
36 laplace();
37 p1 = cdr(p1);
39 add_all(tos - h);
40 restore();
41 return;
44 // L[Af] = A L[f]
46 if (car(F) == symbol(MULTIPLY)) {
47 push(F);
48 push(T);
49 partition();
50 F = pop();
51 A = pop();
52 laplace_main();
53 push(A);
54 multiply();
55 } else
56 laplace_main();
58 restore();
61 void
62 laplace_main(void)
64 int n;
66 // L[t] = 1 / s^2
68 if (F == symbol(SYMBOL_T)) {
69 push_symbol(SYMBOL_S);
70 push_integer(-2);
71 power();
72 return;
75 // L[t^n] = n! / s^(n+1)
77 if (car(F) == symbol(POWER) && cadr(F) == T) {
78 push(caddr(F));
79 n = pop_integer();
80 if (n > 0) {
81 push_integer(n);
82 factorial();
83 push_symbol(SYMBOL_S);
84 push_integer(n + 1);
85 power();
86 divide();
87 return;
91 stop("laplace: cannot solve");
94 #if SELFTEST
96 static char *s[] = {
98 // float ok?
100 "laplace(3t^2.0)",
101 "6/(s^3)",
104 void
105 test_laplace(void)
107 test(__FILE__, s, sizeof s / sizeof (char *));
110 #endif