File: README

package info (click to toggle)
r-cran-polynom 1.4-1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 212 kB
  • sloc: makefile: 2
file content (199 lines) | stat: -rw-r--r-- 6,691 bytes parent folder | download | duplicates (2)
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
'polynom' is an R collection of functions to implement a class for
univariate polynomial manipulations.  It is based on the corresponding S
package by Bill Venables <Bill.Venables@adelaide.edu.au>, and was
adapted to R by Kurt Hornik <Kurt.Hornik@R-project.org> and Martin
Maechler <maechler@stat.math.ethz.ch>.

The original 'NOTES' is appended below:

	       A Univariate Polynomial Class for S
	       ===================================

Introduction and Summary:

The following started as a straightforward programming exercise in
operator overloading, but seems to be more generally useful.  The goal
is to write a polynomial class, that is a suite of facilities that allow
operations on polynomials: addition, subtraction, multiplication,
"division", remaindering, printing, plotting, and so forth, to be
conducted using the same operators and functions, and hence with the
same ease, as ordinary arithmetic, plotting, printing, and so on.

The class is limited to univariate polynomials, and so they may
therefore be uniquely defined by their numeric coefficient vector.
Coercing a polynomial to numeric yields this coefficient vector as a
numeric vector.

For reasons of simplicity it is limited to REAL polynomials; handling
polynomials with complex coefficients would be a simple extension.
Dealing with polynomials with polynomial coefficients, and hence
multivariate polynomials, would be feasible, though a major undertaking
and the result would be very slow and of rather limited usefulness and
efficiency.

General Orientation:

The function polynomial() creates an object of class `polynomial' from a
numeric coefficient vector.  Coefficient vectors are assumed to apply to
the powers of the carrier variable in increasing order, that is, in the
`truncated power series' form, and in the same form as required by
polyroot(), the system function for computing zeros of polynomials.  (As
a matter or terminology, the "zeros" of the polynomial P(x) are the same
as the "roots" of equation P(x) = 0.)

Polynomials may also be created by specifying a set of (x,y) pairs and
constructing the Lagrange interpolation polynomial that passes through
them (poly.calc(x, y)).  If y is a matrix, an interpolation polynomial
is calculated for each column and the result is a list of polynomials
(of class `polylist').

The third way polynomials are commonly generated is via its zeros using
poly.calc(z), which creates the monic polynomial of lowest degree with
the values in z as its zeros.

The core facility provided is the group method function
Ops.polynomial(), which allows arithmetic operations to be performed on
polynomial arguments using ordinary arithmetic operators.

Notes:

 1. `+', `-' and `*' have their obvious meanings for polynomials.
 
 2. `^' is limited to non-negative integer powers.
 
 3. `/' returns the polynomial quotient.  If division is not exact the
    remainder is discarded, (but see 4.)
 
 4. `%%' returns the polynomial remainder, so that if all arguments are
    polynomials, p1 * (p2 / p1) + p2 %% p1 is the same polynomial as p2,
    provided p1 is not the zero polynomial.
 
 5. If numeric vectors are used in polynomial arithmetic they are
    coerced to polynomial, which could be a source of surprise.  In the
    case of scalars, though, the result is natural.
 
 6. Some logical operations are allowed, but not always very
    satisfactorily.  `==' and `!=' mean exact equality or not,
    respectively, however `<', `<=', `>', `>=', `!', `|' and `&' are not
    allowed at all and cause stops in the calculation. 
 
 7. Most Math group functions are disallowed with polynomial arguments.
    The only exceptions are `ceiling', `floor', `round', `trunc', and
    `signif'.
 
 8. Summary group functions are not allowed.
 
 9. Polynomials may be evaluated at specific x values either directly
    using predict(p, x), or indirectly using as.function(p), which
    creates a function to evaluate the polynomial, and then using the
    result.
 
10. The print method for polynomials can be slow and is a bit
    pretentious.  The plotting methods (plot(p), lines(p), points(p))
    are fairly nominal, but may prove useful.

Examples:

1.  Find the Hermite polynomials up to degree 5 and plot them.
    Also plot their derivatives and integrals on separate plots. 

    The polynomials in question satisfy He(0) = 1, He(1) = x,
    He(n) = x * He(n) - (n - 1) * He(n-1), n = 2, 3, ...

> He <- list(polynomial(1), polynomial(0:1))
> for (n in 3:6) He[[n]] <- 0:1 * He[[n-1]] - (n-2) * He[[n-2]]
> He
[[1]]:
1 

[[2]]:
x 

[[3]]:
-1 + x^2 

[[4]]:
-3*x + x^3 

[[5]]:
3 - 6*x^2 + x^4 

[[6]]:
15*x - 10*x^3 + x^5 

> plot(He[[6]])
> for(n in 1:5) lines(He[[n]], lty=n)

> plot(deriv(He[[6]]))
> for(n in 1:5) lines(deriv(He[[n]]), lty=n)

> plot(integral(He[[6]]))
> for(n in 1:5) lines(integral(He[[n]]), lty=n)

_________________________________________________________________

2.  Find the orthogonal polynomials on x = (0, 1, 2, 4) and
    construct S functions to evaluate them at arbitrary x values.

> x <- c(0,1,2,4)
> op <- poly.orth(x)
> op
List of polynomials:
[[1]]
0.5 

[[2]]
-0.591608 + 0.3380617*x 

[[3]]
0.5640761 - 1.168443*x + 0.282038*x^2 

[[4]]
-0.2860388 + 3.114644*x - 2.502839*x^2 + 0.4370037*x^3 

> p1 <- as.function(op[[2]])
> p2 <- as.function(op[[3]])
> p3 <- as.function(op[[4]])
> cbind(P1 = p1(x), P2 = p2(x), P3 = p3(x))
              P1         P2          P3
[1,] -0.59160798  0.5640761 -0.28603878
[2,] -0.25354628 -0.3223292  0.76277007
[3,]  0.08451543 -0.6446584 -0.57207755
[4,]  0.76063883  0.4029115  0.09534626
> poly(x, 3)
               1          2           3 
[1,] -0.59160798  0.5640761 -0.28603878
[2,] -0.25354628 -0.3223292  0.76277007
[3,]  0.08451543 -0.6446584 -0.57207755
[4,]  0.76063883  0.4029115  0.09534626

[excess output deleted for simplicity]

_________________________________________________________________

3. Miscellaneous computations using polynomial arithmetic.

> p1 <- poly.calc(1:6)
> p1
720 - 1764*x + 1624*x^2 - 735*x^3 + 175*x^4 - 21*x^5 + x^6 

> p2 <- change.origin(p1, 3)
> p2
-12x + 4x^2 + 15x^3 - 5x^4 - 3x^5 + x^6 

> predict(p1, 0:7)
[1] 720    0    0    0    0    0     0   720
> predict(p2, 0:7)
[1]   0    0    0    0  720 5040 20160 60480
> predict(p2, 0:7 - 3)
[1] 720    0    0    0    0    0     0   720

> p3 <- (p1 - 2 * p2)^2         # moderate arithmetic expression.
> p3
518400 - 2505600*x + 5354640*x^2 - 6725280*x^3 + 5540056*x^4 - 
3137880*x^5 + 1233905*x^6 - 328050*x^7 + 53943*x^8 - 4020*x^9 - 
145*x^10 + 30*x^11 + x^12 

> fp3 <- as.function(p3)        # should have 1, 2, 3 as zeros
> fp3(0:4)
[1]  518400       0       0       0 2073600