-
Notifications
You must be signed in to change notification settings - Fork 10
/
README.txt
108 lines (82 loc) · 3.67 KB
/
README.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
racket-cas
==========
A Simple Computer Algebra System (CAS) for Racket
-------------------------------------------------
Here is a short example. Open racket-cas.rkt in DrRacket and run it.
To begin write:
> (require racket-cas/repl)
This changes the meaning of quote such that automatic simplifier
will simplify all quoted and quasi-quoted expressions.
> '(+ x 2 a 3 (* 4 x))
'(+ 5 a (* 5 x))
Also, in the repl it can be convenient to write x instead of 'x so,
we will turn on auto quoting:
> (require racket-cas/auto-quote)
> x
'x
TeX output is available;
> (tex (expand '(expt (+ a b) 2)))
This can also be rendered at the REPL:
> (render (expand '(expt (+ a b) 2)))
The Taylor series of sin(x) around x=2 of degree 3:
> (taylor '(sin x) x 2 3)
'(+ (* -1/2 (expt (+ -2 x) 2) (sin 2)) (* -1/6 (expt (+ -2 x) 3)
(cos 2)) (* (+ -2 x) (cos 2)) (sin 2))
Since (sin 2) can not be represented exactly it is not evaluated
numerically. Use N (for numeric) to force numeric evaluation:
> (N (expand (taylor '(sin x) x 2 3)))
'(+ -0.6318662024609201
(* 2.2347416901985055 x)
(* -0.8707955499599832 (expt x 2))
(* 0.0693578060911904 (expt x 3)))
An alternative is to use 2.0 instead of 2.
> (expand (taylor '(sin x) x 2.0 3))
<same result>
This works since 2.0 is an inexact number, and inexactness is contagious.
We expect the Taylor series around 2.0 approximates sin(x) for x near 2.0.
Let's compare the Taylor series in 2.1 with sin(2.1).
First we substitute the x in the Taylor series with 2.1.
> (subst (expand (N (taylor '(sin x) x 2 3))) x 2.1)
0.8632056138429305
The we calculate sin(2.1) for comparision:
> (sin 2.1)
0.8632093666488738
To show that Racket CAS also supports bigfloats (floating point
numbers with an arbitrary number of decimals), let's see what
the result is with a precision of 100 binary decimals:
> (bf-N (taylor '(sin x) x 2 3) 100 x (bf 2.1))
(bf #e0.86320561384293019376447471077597)
We can use standard plot library to draw a few graphs of the Taylor polynomials.
The plot library expects standard Racket functions from number to number.
The function compile will turn a symbolic expression into a normal Racket function.
> (require plot)
> (plot (list (function (compile (taylor '(sin x) x 0 5)) #:color "green")
(function sin #:color "red" -3.14 3.14)))
<nice graphs appear in DrRacket>
Let's compare Taylor polynomials of various orders.
> (plot (append (for/list ([n 6]) (function (compile (taylor '(cos x) x pi n)) #:color (+ n 1)))
(list (function cos #:color "red")))
#:x-min (- pi) #:x-max (* 3 pi) #:y-min -2 #:y-max 2)
<graphs appear>
Racket CAS can compute limits for x->a where a is a real number.
The limit function will apply l'Hospital's rule if neccessary (upto 10 times).
Standard high school limits therefore work:
> (limit '(/ (sin x) x) x 0)
1
For anyone interested in contributing to the code, the main file is racket-cas/racket-cas.rkt.
In that file quote behaves as the standard Racket quote.
Since +, *, -, / are bound to their standard Racket meaning,
the functions ⊕ ⊗ ⊖ ⊘ are used where the arguments are (automatically simplified)
symbolic expressions.
For functions such as expt, sin etc. the corresponding functions that handle symbolic
expressions are Expt, Sin, etc.
Thanks to all for contributing code and sending in bugs.
In particular, thanks to the following contributors:
Contributors
------------
- Bowen Fu (integrate, complex numbers, together, combine and more)
Related
-------
Check out another CAS for Racket, https://github.com/Metaxal/rascas .
Enjoy
/soegaard