123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- // Laplace transform
- #include "stdafx.h"
- #include "defs.h"
- void
- eval_laplace(void)
- {
- push(cadr(p1));
- eval();
- push(symbol(SYMBOL_T));
- laplace();
- }
- #define F p3
- #define T p4
- #define A p5
- void
- laplace(void)
- {
- int h;
- save();
- T = pop();
- F = pop();
- // L[f + g] = L[f] + L[g]
- if (car(F) == symbol(ADD)) {
- p1 = cdr(F);
- h = tos;
- while (iscons(p1)) {
- push(car(p1));
- push(T);
- laplace();
- p1 = cdr(p1);
- }
- add_all(tos - h);
- restore();
- return;
- }
- // L[Af] = A L[f]
- if (car(F) == symbol(MULTIPLY)) {
- push(F);
- push(T);
- partition();
- F = pop();
- A = pop();
- laplace_main();
- push(A);
- multiply();
- } else
- laplace_main();
- restore();
- }
- void
- laplace_main(void)
- {
- int n;
- // L[t] = 1 / s^2
- if (F == symbol(SYMBOL_T)) {
- push_symbol(SYMBOL_S);
- push_integer(-2);
- power();
- return;
- }
- // L[t^n] = n! / s^(n+1)
- if (car(F) == symbol(POWER) && cadr(F) == T) {
- push(caddr(F));
- n = pop_integer();
- if (n > 0) {
- push_integer(n);
- factorial();
- push_symbol(SYMBOL_S);
- push_integer(n + 1);
- power();
- divide();
- return;
- }
- }
- stop("laplace: cannot solve");
- }
- #if SELFTEST
- static char *s[] = {
- // float ok?
- "laplace(3t^2.0)",
- "6/(s^3)",
- };
- void
- test_laplace(void)
- {
- test(__FILE__, s, sizeof s / sizeof (char *));
- }
- #endif
|