laplace.cpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. // Laplace transform
  2. #include "stdafx.h"
  3. #include "defs.h"
  4. void
  5. eval_laplace(void)
  6. {
  7. push(cadr(p1));
  8. eval();
  9. push(symbol(SYMBOL_T));
  10. laplace();
  11. }
  12. #define F p3
  13. #define T p4
  14. #define A p5
  15. void
  16. laplace(void)
  17. {
  18. int h;
  19. save();
  20. T = pop();
  21. F = pop();
  22. // L[f + g] = L[f] + L[g]
  23. if (car(F) == symbol(ADD)) {
  24. p1 = cdr(F);
  25. h = tos;
  26. while (iscons(p1)) {
  27. push(car(p1));
  28. push(T);
  29. laplace();
  30. p1 = cdr(p1);
  31. }
  32. add_all(tos - h);
  33. restore();
  34. return;
  35. }
  36. // L[Af] = A L[f]
  37. if (car(F) == symbol(MULTIPLY)) {
  38. push(F);
  39. push(T);
  40. partition();
  41. F = pop();
  42. A = pop();
  43. laplace_main();
  44. push(A);
  45. multiply();
  46. } else
  47. laplace_main();
  48. restore();
  49. }
  50. void
  51. laplace_main(void)
  52. {
  53. int n;
  54. // L[t] = 1 / s^2
  55. if (F == symbol(SYMBOL_T)) {
  56. push_symbol(SYMBOL_S);
  57. push_integer(-2);
  58. power();
  59. return;
  60. }
  61. // L[t^n] = n! / s^(n+1)
  62. if (car(F) == symbol(POWER) && cadr(F) == T) {
  63. push(caddr(F));
  64. n = pop_integer();
  65. if (n > 0) {
  66. push_integer(n);
  67. factorial();
  68. push_symbol(SYMBOL_S);
  69. push_integer(n + 1);
  70. power();
  71. divide();
  72. return;
  73. }
  74. }
  75. stop("laplace: cannot solve");
  76. }
  77. #if SELFTEST
  78. static char *s[] = {
  79. // float ok?
  80. "laplace(3t^2.0)",
  81. "6/(s^3)",
  82. };
  83. void
  84. test_laplace(void)
  85. {
  86. test(__FILE__, s, sizeof s / sizeof (char *));
  87. }
  88. #endif