taylor.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. /* Taylor expansion of a function
  2. push(F)
  3. push(X)
  4. push(N)
  5. push(A)
  6. taylor()
  7. */
  8. #include "stdafx.h"
  9. #include "defs.h"
  10. void
  11. eval_taylor(void)
  12. {
  13. // 1st arg
  14. p1 = cdr(p1);
  15. push(car(p1));
  16. eval();
  17. // 2nd arg
  18. p1 = cdr(p1);
  19. push(car(p1));
  20. eval();
  21. p2 = pop();
  22. if (p2 == symbol(NIL))
  23. guess();
  24. else
  25. push(p2);
  26. // 3rd arg
  27. p1 = cdr(p1);
  28. push(car(p1));
  29. eval();
  30. p2 = pop();
  31. if (p2 == symbol(NIL))
  32. push_integer(24); // default number of terms
  33. else
  34. push(p2);
  35. // 4th arg
  36. p1 = cdr(p1);
  37. push(car(p1));
  38. eval();
  39. p2 = pop();
  40. if (p2 == symbol(NIL))
  41. push_integer(0); // default expansion point
  42. else
  43. push(p2);
  44. taylor();
  45. }
  46. #define F p1
  47. #define X p2
  48. #define N p3
  49. #define A p4
  50. #define C p5
  51. void
  52. taylor(void)
  53. {
  54. int i, k;
  55. save();
  56. A = pop();
  57. N = pop();
  58. X = pop();
  59. F = pop();
  60. push(N);
  61. k = pop_integer();
  62. if (k == (int) 0x80000000) {
  63. push_symbol(TAYLOR);
  64. push(F);
  65. push(X);
  66. push(N);
  67. push(A);
  68. list(5);
  69. restore();
  70. return;
  71. }
  72. push(F); // f(a)
  73. push(X);
  74. push(A);
  75. subst();
  76. eval();
  77. push_integer(1);
  78. C = pop();
  79. for (i = 1; i <= k; i++) {
  80. push(F); // f = f'
  81. push(X);
  82. derivative();
  83. F = pop();
  84. if (iszero(F))
  85. break;
  86. push(C); // c = c * (x - a)
  87. push(X);
  88. push(A);
  89. subtract();
  90. multiply();
  91. C = pop();
  92. push(F); // f(a)
  93. push(X);
  94. push(A);
  95. subst();
  96. eval();
  97. push(C);
  98. multiply();
  99. push_integer(i);
  100. factorial();
  101. divide();
  102. add();
  103. }
  104. restore();
  105. }
  106. #if SELFTEST
  107. static char *s[] = {
  108. "taylor(1/(5+4*cos(x)),x,6,0)-(1/9+2/81*x^2+5/1458*x^4+49/131220*x^6)",
  109. "0",
  110. "taylor(1/(5+4*cos(x)),x,6)-(1/9+2/81*x^2+5/1458*x^4+49/131220*x^6)",
  111. "0",
  112. };
  113. void
  114. test_taylor(void)
  115. {
  116. test(__FILE__, s, sizeof s / sizeof (char *));
  117. }
  118. #endif