1depend r,x;
2
3
4
5depend {u}, a, b, {a, b}, v;
6
7
8
9df(u,v);
10
11
12df(u,v)
13
14
15on expanddf;
16
17
18
19df(u,v);
20
21
22df(a,v)*df(u,a) + df(b,v)*df(u,b)
23
24
25operator f;
26
27
28
29df(f(a),v);
30
31
32df(f(a),a)*df(a,v)
33
34
35df(f(u),v);
36
37
38df(f(u),u)*(df(a,v)*df(u,a) + df(b,v)*df(u,b))
39
40
41let x^3=u;
42
43
44
45let f(r)^3=u;
46
47
48
49df(x,u);
50
51
52df(x,u)
53
54
55df (f(r),u);
56
57
58df(f(r),u)
59
60
61df(f(r,r^2),x);
62
63
64        2
65df(f(r,r ),r)*df(r,x)
66
67
68df(f(r,cos(x)),x);
69
70
71df(f(r,cos(x)),x)
72
73
74df(f(r,cos y),x);
75
76
77df(f(r,cos(y)),r)*df(r,x)
78
79
80depend cos(y),x;
81
82
83
84df(f(r,cos y),x);
85
86
87df(f(r,cos(y)),r)*df(r,x)
88
89
90depend y,x;
91
92
93
94df(f(r,cos y),x);
95
96
97 - df(f(r,cos(y)),cos(y))*df(y,x)*sin(y) + df(f(r,cos(y)),r)*df(r,x)
98
99
100df(cos y,x);
101
102
103 - df(y,x)*sin(y)
104
105
106nodepend y,x;
107
108
109
110df(cos y,x);
111
112
1130
114
115
116off expanddf;
117
118
119
120df(f(r),r,x);
121
122
123df(f(r),r,x)
124
125
126on expanddf;
127
128
129
130df(f(r),r,x);
131
132
133df(f(r),r,2)*df(r,x)
134
135
136operator g;
137
138
139
140off expanddf;
141
142
143
144depend g(v),A1;
145
146
147
148df(g(v),A1);
149
150
151df(g(v),a1)
152
153
154on expanddf;
155
156
157
158df(g(v),A1);
159
160
161df(g(v),a1)
162
163
164off expanddf;
165
166
167
168df(df(int(g(v),v),A1),v);
169
170
171df(g(v),a1)
172
173
174on expanddf;
175
176
177
178df(df(int(g(v),v),A1),v);
179
180
181df(g(v),a1)
182
183
184% more chain rule tests: multiple derivatives
185
186off expanddf;
187
188
189operator y;
190
191
192depend ux,x;
193
194
195
196comment
197 Since ux depends on x, derivatives w.r.t. x can be expressed via
198 the chain through derivatives w.r.t. uxi, if the switch expanddf
199 is set to on ;
200
201
202df(y(x),x);
203
204
205df(y(x),x)
206
207
208df(y(ux),x);
209
210
211df(y(ux),x)
212
213
214df(y(x),x,ux);
215
216
2170
218
219
220df(y(x),ux,x);
221
222
2230
224
225
226df(y(ux),x,ux);
227
228
229df(y(ux),ux,x)
230
231
232df(y(ux),ux,x);
233
234
235df(y(ux),ux,x)
236
237
238on expanddf;
239
240
241
242df(y(x),x);
243
244
245df(y(x),x)
246
247
248df(y(ux),x);
249
250
251df(y(ux),ux)*df(ux,x)
252
253
254df(y(x),x,ux);
255
256
2570
258
259
260df(y(x),ux,x);
261
262
2630
264
265
266df(y(ux),x,ux);
267
268
269df(y(ux),ux,2)*df(ux,x) + df(y(ux),ux)*df(ux,x,ux)
270
271
272df(y(ux),ux,x);
273
274
275df(y(ux),ux,2)*df(ux,x)
276
277
278off expanddf;
279
280
281
282comment
283 Now do the same, but with an explicit value for the derivative of ux w.r.t. x;
284
285
286let df(ux,x) = 1/e**x;
287
288
289
290df(y(x),x);
291
292
293df(y(x),x)
294
295
296df(y(ux),x);
297
298
299df(y(ux),x)
300
301
302df(y(x),x,ux);
303
304
3050
306
307
308df(y(x),ux,x);
309
310
3110
312
313
314df(y(ux),x,ux);
315
316
317df(y(ux),ux,x)
318
319
320df(y(ux),ux,x);
321
322
323df(y(ux),ux,x)
324
325
326on expanddf;
327
328
329
330df(y(x),x);
331
332
333df(y(x),x)
334
335
336df(y(ux),x);
337
338
339 df(y(ux),ux)
340--------------
341       x
342      e
343
344
345df(y(x),x,ux);
346
347
3480
349
350
351df(y(x),ux,x);
352
353
3540
355
356
357df(y(ux),x,ux);
358
359
360 df(y(ux),ux,2)
361----------------
362        x
363       e
364
365
366df(y(ux),ux,x);
367
368
369 df(y(ux),ux,2)
370----------------
371        x
372       e
373
374
375% test commuting vs. non-commuting
376
377off expanddf;
378
379
380
381df(df(g(v),A1),v);
382
383
384df(g(v),a1,v)
385
386
387on expanddf;
388
389
390
391df(df(g(v),A1),v);
392
393
394df(g(v),a1,v)
395
396
397on commutedf;
398
399
400
401df(df(g(v),A1),v);
402
403
404df(g(v),a1,v)
405
406
407off commutedf;
408
409
410
411df(df(g(v),A1),v);
412
413
414df(g(v),a1,v)
415
416
417depend uuu,xxx;
418
419
420
421off expanddf;
422
423
424
425df(uuu,xxx,uuu);
426
427
428df(uuu,xxx,uuu)
429
430
431df(y(uuu),xxx,uuu);
432
433
434df(y(uuu),uuu,xxx)
435
436
437df(y(uuu),uuu,xxx);
438
439
440df(y(uuu),uuu,xxx)
441
442
443on commutedf;
444
445
446
447df(uuu,xxx,uuu);
448
449
4500
451
452
453df(y(uuu),xxx,uuu);
454
455
456df(y(uuu),uuu,xxx)
457
458
459df(y(uuu),uuu,xxx);
460
461
462df(y(uuu),uuu,xxx)
463
464
465off commutedf;
466
467
468on expanddf;
469
470
471
472df(uuu,xxx,uuu);
473
474
475df(uuu,xxx,uuu)
476
477
478df(y(uuu),xxx,uuu);
479
480
481df(y(uuu),uuu,2)*df(uuu,xxx) + df(y(uuu),uuu)*df(uuu,xxx,uuu)
482
483
484df(y(uuu),uuu,xxx);
485
486
487df(y(uuu),uuu,2)*df(uuu,xxx)
488
489
490on commutedf;
491
492
493
494df(uuu,xxx,uuu);
495
496
4970
498
499
500df(y(uuu),xxx,uuu);
501
502
503df(y(uuu),uuu,2)*df(uuu,xxx)
504
505
506df(y(uuu),uuu,xxx);
507
508
509df(y(uuu),uuu,2)*df(uuu,xxx)
510
511
512
513% test inconsistent dependencies
514
515operator h;
516
517
518
519depend u1,a2,b1;
520
521
522
523depend {a2,b1,c1},v1;
524
525
526
527depend h(u1),a2,b1,c1;
528
529
530
531off expanddf;
532
533
534
535df(h(u1),v1);
536
537
538df(h(u1),v1)
539
540
541on expanddf;
542
543
544
545df(u1,v1);
546
547
548df(a2,v1)*df(u1,a2) + df(b1,v1)*df(u1,b1)
549
550
551df(h(u1),v1);
552
553
554*** Possible inconsistent dependencies in h(u1)
555
556df(h(u1),v1)
557
558
559
560df(f(g(u),h(u)),u);
561
562
563df(f(g(u),h(u)),u)
564
565
566on allowdfint;
567
568
569
570depend xx,vv;
571
572
573
574df(int(exp(vv*xx^3)/xx,xx),vv);
575
576
577       3
578  vv*xx
579 e      *(3*df(xx,vv)*vv + xx)
580-------------------------------
581            3*vv*xx
582
583
584% test differentiation of parameter integral;
585
586df(int(f(vv,xx),xx),vv);
587
588
589df(int(f(vv,xx),xx),vv)
590
591
592on allowdfint,dfint;
593
594
595
596% this used to return int(df(f(vv,xx),vv),xx)
597% which is wrong since xx, the upper limit of the integration depends on vv
598df(int(f(vv,xx),xx),vv);
599
600
601df(xx,vv)*f(vv,xx) + int(df(f(vv,xx),vv),xx)
602
603
604end;
605
606Tested on x86_64-pc-windows CSL
607Time (counter 1): 0 ms
608
609End of Lisp run after 0.00+0.06 seconds
610real 0.21
611user 0.00
612sys 0.07
613