HandyModRTransform.deriv3 is wrong for m > 2
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 75/100
Direzione di ricerca
Il bug si trova in HandyModRTransform.deriv3 in grid/rtransform.py, nel primo termine del numeratore che usa 2 * two_m. Confronta quel termine con la derivata terza simbolica della trasformazione e controlla deriv3_inverse, che ne dipende. Riproduci con lo snippet solve_ode_ivp dell'issue per m = 3 e 4. È completato quando deriv3 coincide con le differenze finite per m = 1-5, la riproduzione restituisce (x + 0.5)**3 e viene aggiunto un test di regressione.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
HandyModRTransform.deriv3 returns the wrong third derivative whenever m >= 3. For m = 1 and m = 2 it is correct, which is the only range the current tests use.
The first term in the numerator is written as 2 * two_m * (m - 2) * (m - 1) * (1 - two_m + size_r) ** 2, but differentiating r(x) three times gives two_m**2 there, not 2 * two_m. The term is multiplied by (m - 1)(m - 2), so the mistake only shows up from m = 3 on.
Because deriv3 feeds deriv3_inverse and the transformed ODE solvers, those are off too. A small example with solve_ode_ivp on y''' = 6, y(-0.5) = y'(-0.5) = y''(-0.5) = 0, whose exact solution is (x + 0.5)**3:
import numpy as np
from grid.ode import solve_ode_ivp
from grid.rtransform import HandyModRTransform
xs = np.array([0.0, 0.25, 0.5])
for m in [2, 3, 4]:
tf = HandyModRTransform(0.1, 10.0, m)
sol = solve_ode_ivp((-0.5, 0.5), lambda x: 6 * np.ones_like(x), [0, 0, 0, 1],
[0.0, 0.0, 0.0], transform=tf, rtol=1e-10, atol=1e-10)
print(m, sol(xs)[0], (xs + 0.5) ** 3)
On master:
2 [0.125 0.421875 1. ] [0.125 0.421875 1. ]
3 [0.12976934 0.45091849 1.10383533] [0.125 0.421875 1. ]
4 [0.14209262 0.53001896 1.41016422] [0.125 0.421875 1. ]
Comparing deriv3 directly against the symbolic third derivative (sympy) of transform for rmin=0.1, rmax=10, the relative error is ~1e-15 for m = 1, 2 and 0.75, 0.87, 0.94 for m = 3, 4, 5.
The fix is a one-line change (2 * two_m to two_m**2) plus a test that checks deriv3 against finite differences for m = 1 to 5. I have a patch ready if that's fine.
- Lingua principale
- Python
- Stelle
- 102
- Fork
- 43
- Merge medio
- 7g 11h
- PR unite (30g)
- 4
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di theochem/grid
-
Radial Transformation UpdatesForse di nuovo libera @merreeves l’ha presa 31 giorni fa e non c’è nessuna pull request aperta. Aperta
-
Splitting grid data from packageForse di nuovo libera @FarnazH l’ha presa 57 giorni fa e non c’è nessuna pull request aperta. Aperta
-
Additional low-discrepancy sequences for (hyper)cubic integrationForse di nuovo libera @Zohaibcode740 l’ha presa 83 giorni fa e non c’è nessuna pull request aperta. Aperta
-
Add full support for Ahrens-Beylkin gridsForse di nuovo libera @marco-2023 l’ha presa 126 giorni fa e non c’è nessuna pull request aperta. Aperta
-
Parameter Study & Benchmarking Results for solve_poisson_bvp and solve_poisson_ivpForse di nuovo libera @marco-2023 l’ha presa 84 giorni fa e non c’è nessuna pull request aperta. Aperta
Tutte le issue di theochem/grid
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 64/100
its-me-prash/vwgroup-connect-ha#2019 ·
I maintainer di solito rispondono entro 1 giorno
-
bug good first issue
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
KonstantinStarovoytov/kitden#21 ·
I maintainer di solito rispondono entro 1 giorno
-
RefactorAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
ehmatthes/gh-profiler#166 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
smart-on-fhir/smart-fetch#73 ·
-
good first issue help wanted
Difficoltà 1/5 1-3 ore Idoneità per principianti 85/100
RizgarOzan/playcal#13 ·