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