From eaaf3a3fec29cf1c9d93cf358d58a63e56b58071 Mon Sep 17 00:00:00 2001 From: SerbaC6 Date: Mon, 17 Aug 2026 19:31:21 +0300 Subject: [PATCH] =?UTF-8?q?feat(interfe=C8=9Be):=20lista=20din=20imbunatat?= =?UTF-8?q?iri.md,=20ambele=20treceri?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Global: - derularea paginii se reține la ieșire și se reface la întoarcere. Poziția se citea din `window.scrollY` **după** ce pagina veche ieșise din DOM, când browserul o tăiase deja la zero, iar efectul rula după desenare, deci prindea și `scroll`-ul de zero. Acum vine dintr-un `ref`, într-un `useLayoutEffect`; - casetele „de reținut" scurtate la una-două propoziții, cu spațiu mai mic sub `sm`; - toleranțele se scriu întotdeauna `1e-…` și rămân fără săgeți; - tragerea de pe grafic nu mai selectează etichetele desenului. Pe pagini: - cuadraturi: fiecare filă cu funcția ei — Gauss pornește pe `sin(x)`, unde diferența dintre noduri alese și echidistante e `1,6e-5` față de `4,1e-2`; play pe fila Gaussiană; toleranța devine parametru; - Newton-Cotes: grafic pe toată lățimea, aria rămasă pe dinafară, fără propoziția pasului și fără caseta erorii, iar scurtăturile lui `N` nu se mai repetă; - derivare: pasul `h` e parametru, cu butoane de ordin de mărime mai mari; - eliminare gaussiană: parametrii sunt o matrice, nu douăsprezece câmpuri; - interpolări: filele pornesc pe `sin(πx)`, fila Runge își aduce funcția ei, formulele redevin simbolice, spline-ul rămâne cu o singură curbă; - metodele puterii: interfața interactivă a fost scoasă, la cerere; - Bézier: `P₀⁽¹⁾`, nivelurile se iau cu săgeți și alternează cald-rece; - titluri și texte de card, la douăsprezece pagini. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01C9HuzXn5AF7qud2k6Vmx4D --- CLAUDE.md | 15 +- Progress.md | 36 +- imbunatatiri.md | 153 +--- src/algorithms/curbe-bezier/bezier.ts | 6 +- .../derivare-numerica/functii-derivare.ts | 4 +- src/algorithms/registry.ts | 38 +- src/components/content/AnimatiaBezier.tsx | 4 +- .../content/AnimatiaEliminariiGaussiene.tsx | 17 +- .../content/AnimatiaInterpolarii.tsx | 21 +- .../content/AnimatiaMetodelorPuterii.tsx | 18 +- src/components/content/Callout.tsx | 8 +- src/components/content/InterfataBezier.tsx | 55 +- .../content/InterfataCuadraturi.tsx | 289 ++++---- .../content/InterfataDerivareNumerica.tsx | 103 ++- .../content/InterfataEcuatiiNeliniare.tsx | 3 +- .../content/InterfataEliminareGaussiana.tsx | 144 +++- .../content/InterfataInterpolare.tsx | 220 +++--- .../content/InterfataMetodeDeGradient.tsx | 3 +- .../content/InterfataMetodelorPuterii.tsx | 688 ------------------ .../content/InterfataNewtonCotes.tsx | 260 ++++--- .../content/InterfataOrtogonalitate.tsx | 23 +- src/components/layout/ScrollToTop.tsx | 56 +- src/components/viz/FormulaBlock.tsx | 14 +- src/components/viz/NumberInput.tsx | 48 +- src/components/viz/Plot.tsx | 5 +- src/components/viz/PlotArie.tsx | 37 +- .../cuadraturi-adaptive-si-gaussiene.tsx | 48 +- src/content/curbe-bezier.tsx | 21 +- src/content/ecuatii-diferentiale.tsx | 6 +- src/content/ecuatii-neliniare.tsx | 72 +- src/content/interpolare-polinomiala.tsx | 126 ++-- src/content/metode-iterative.tsx | 3 +- src/content/newton-cotes.tsx | 45 +- src/content/norme-si-ortogonalitate.tsx | 3 +- src/pages/PaginaAlgoritm.tsx | 3 +- 35 files changed, 1014 insertions(+), 1581 deletions(-) delete mode 100644 src/components/content/InterfataMetodelorPuterii.tsx diff --git a/CLAUDE.md b/CLAUDE.md index 5e4dfeb..36ab5c8 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -588,13 +588,12 @@ Regulile care se aplică la fiecare punct de mai jos, fără excepție: - [x] **Pagina 8 — `metodele-puterii`** (puterea, puterea inversă, Rayleigh, deflație). Clipul (`AnimatiaMetodelorPuterii`) lucrează **în plan**, pe `A = [[3,1],[1,3]]`, cu valorile proprii exacte 4 și 2 pe cele două diagonale: acolo iterația se vede ca o săgeată care se rotește, ceea - ce o matrice 3×3 n-ar arăta fără o proiecție scrisă de mână. Interfața - (`InterfataMetodelorPuterii`) are trei taburi pe aceeași matrice editabilă 3×3 — directă, - inversă cu deplasare, Rayleigh —, cu barele componentelor lui `v⁽ᵏ⁾` peste cele ale pasului - dinainte. **Deflația rămâne doar în teorie**, prin decizie: nu e o iterație care se derulează, - ci o schimbare a matricei între două rulări, iar un tab lângă celelalte trei ar face-o să pară - altceva decât e. Matematica ei stă totuși în `src/algorithms/metodele-puterii/` și e verificată - numeric, ca formulele din teorie să se poată garanta. + ce o matrice 3×3 n-ar arăta fără o proiecție scrisă de mână. **Interfața interactivă a fost + construită și scoasă la cerere**, cu tot cu fișierul ei: pagina rămâne cu clipul și cu teoria. + **Deflația rămâne doar în teorie**, prin decizie: nu e o iterație care se derulează, ci o + schimbare a matricei între două rulări. Matematica amândurora stă totuși în + `src/algorithms/metodele-puterii/` și e verificată numeric, ca formulele din teorie să se + poată garanta. - [ ] **Pagina 9 — `pagerank`**. `MatrixGrid` pentru matricea stocastică + **graf cu noduri și muchii** — primitivă nouă, și singurul loc din site care o cere. Iterația e chiar metoda puterii de la pagina 8, deci se face după ea. @@ -724,6 +723,8 @@ iar rezultatul se verifică în ambele teme și cu `prefers-reduced-motion` porn Transformarea desenată e fixă: DVS-ul exact al matricei `A = [[1, 2], [0, 1]]`. - **pagina 9** (`pagerank`) — interfața a fost construită și **scoasă la cerere**; pe pagină rămâne clipul (`AnimatiaMatriceiPageRank`), cu `d` fixat la 0,85. +- **pagina 8** (`metodele-puterii`) — la fel, interfața a fost construită și **scoasă la cerere**; + rămâne clipul (`AnimatiaMetodelorPuterii`), pe `A = [[3,1],[1,3]]`. - **pagina 14** (`fft`) — clipul duce singur povestea, iar teoria o scrie în formule. Nu există un set de parametri pe care cititorul să-i schimbe fără să reconstruiască tot planul complex. - **pagina 5** (`metode-iterative`) — interfața a fost construită și **scoasă la cerere**; pe diff --git a/Progress.md b/Progress.md index 969f0b2..2486d0d 100644 --- a/Progress.md +++ b/Progress.md @@ -549,7 +549,7 @@ găzduit de YouTube, încărcat abia la clic (`VideoIncorporat`). Decizie, nu re | 5 | Jacobi, Gauss-Seidel, SOR | `metode-iterative` | curs5 | matrice | [x] | [x] | [x] | [x] | [ ] | [ ] | | 6 | Puncte fixe, bisecție, Newton, secantă | `ecuatii-neliniare` | curs6, curs5 | interval | [x] | n/a | [x] | [x] | [~] | [ ] | | 7 | Gradient descendent, gradient conjugat | `metode-de-gradient` | curs6, curs5 | vale 1D + 3D | [x] | [x] | [x] | [x] | [x] | [ ] | -| 8 | Metodele puterii, Rayleigh, deflație | `metodele-puterii` | curs7 | plan vectori | [x] | [x] | [x] | [x] | [ ] | [ ] | +| 8 | Metodele puterii, Rayleigh, deflație | `metodele-puterii` | curs7 | plan vectori | [x] | [x] | [x] | n/a | [x] | [ ] | | 9 | Algoritmul PageRank | `pagerank` | curs7 | matrice+graf | [x] | [x] | [x] | [ ] | [~] | [ ] | | 10 | Algoritmul QR și valorile proprii | `algoritmul-qr` | curs8, curs3 | matrice | [ ] | [x] | [x] | n/a | [~] | [ ] | | 11 | Descompunerea valorilor singulare (DVS) | `dvs` | curs8, curs3 | cerc→elipsă | [ ] | [x] | [x] | n/a | [~] | [ ] | @@ -616,6 +616,40 @@ Verificări numerice făcute în sesiune, de reținut: - pe pagina 15: `x²` cu punct de mijloc iese exact, iar cu două puncte greșește cu exact `h`; pe `x³/3`, mijlocul greșește cu `h²/3` și cele două puncte cu `x·h + h²/3`. +### A doua trecere prin `imbunatatiri.md` (17 august 2026) + +Lista rescrisă de utilizator după prima trecere. Ce s-a schimbat: + +- **Derularea paginii se reține cu adevărat.** Bugul „mă trimite mereu sus" avea două cauze, iar + prima ascundea a doua. Poziția se citea din `window.scrollY` **în curățarea efectului**, adică + după ce pagina veche ieșise din DOM: documentul nou e scurt, browserul taie derularea la zero, iar + zeroul se scria peste poziția bună. Iar efectul era unul obișnuit, deci rula **după** desenare — + destul cât browserul să apuce să trimită un `scroll` de zero pe ascultătorul încă montat. Acum + poziția vine dintr-un `ref` scris de ascultător, iar montarea și demontarea lui stau într-un + `useLayoutEffect`. **De reținut pentru testat**: un `window.scrollTo` rulat din consola de + automatizare **nu** declanșează evenimentul `scroll`, deci un test scris așa arată un bug care nu + există — se verifică prin derulare adevărată. +- **Pagina 8 (`metodele-puterii`) a rămas fără interfață interactivă**, la cerere: + `InterfataMetodelorPuterii.tsx` a fost ștearsă, iar `interactiv: false` din registru face + secțiunea să lipsească de tot, nu să rămână schelet. +- **Cuadraturi**: fiecare filă își ține funcția și intervalul ei. Fila Gaussiană pornește pe + `sin(x)` de pe `[0, π]`, unde diferența e vizibilă și măsurabilă — cu 4 noduri alese eroarea e + `1,6e-5`, cu 4 echidistante `4,1e-2` —, în timp ce pe funcția adaptivului (`e⁻³ˣ·sin 4x` pe + `[0, 4]`) amândouă greșesc grosolan și butonul nu mai arată nimic. +- **Etichetele funcțiilor din liste trec prin `Notatie`**: `e⁻³ˣ` are trei caractere care nu sunt în + fonturile proiectului, deci se scriau cu exponenți din fontul de sistem. +- **Newton-Cotes**: propoziția pasului a fost scoasă, la fel caseta „Cât a greșit formula" (cifrele + ei stăteau oricum în panou); scurtăturile lui `N` se strâng cu `new Set` după normalizare, fiindcă + la Simpson `1` urcă la `2` și ieșeau două butoane „2". +- **Derivare numerică**: butoanele lui `h` sunt mai mari și cu exponentul prin `Notatie`. +- **Eliminare gaussiană**: parametrii nu mai sunt douăsprezece câmpuri cu nume deasupra, ci **o + matrice** — paranteze din chenar, linie înaintea termenilor liberi, cifre centrate. Numele + fiecărei celule a rămas ca nume accesibil (`etichetaAscunsa` din `NumberInput`). +- **Interpolări**: filele care lasă alegerea pornesc pe `sin(πx)`, iar fila Runge își aduce funcția + ei și blochează lista. Formula fiecărei file e acum **simbolică**, nu umplută cu numerele de + atunci; propoziția pasului a dispărut de pe Neville; fila spline nu mai desenează și polinomul de + comparație; nodurile pornesc de la 5 și își scriu numele doar până la 5. + ### Pagina 13 — `curbe-bezier`, ce e gata și ce nu Ce există: diff --git a/imbunatatiri.md b/imbunatatiri.md index 15e59ab..6c937ff 100644 --- a/imbunatatiri.md +++ b/imbunatatiri.md @@ -1,147 +1,32 @@ -# Regula generala(pusa in CLAUDE.md, si schimbat ce nu e asa din fiecare pagina): -1. ✅ De acum, cand faci animatii, scoate din titlu acel 01,02,.... pus doar pe o linie. Sterge asta din animatia de la paginile pentru Householder, Jacobi, QR. -2. ✅ Taie paragraful de final din fiecare pagina la capitolul de teorie, ce care incepe cu asta de scris: Ce rămâne, dacă rămâne un singur lucru -3. ✅ Fa scrisul din fiecare animatie, cel de sub titluri, care e scris mic, mult mai mare. Acum trebuie sa te chiorasti ca sa il vezi -4. ✅ Nu mai pune subtitrarile sa fie scrise de jos in sus. Fa-le de sus in jos cand e pop-up nou de text +# De schimbat la Cuadraturi: +La interactiv: +1. La Gaussiene, pune prima functie radical(x) +2. Scrie titlul de la Cuadraturi adaptive "Cuadraturi Adaptive" -# De rezolvat la animatii si altele: -- ✅ Fa cumva sa pot schimba din sageti unde sunt pe video -- ✅ Atunci cand ies de pe pagina, clipul si pagina se reiau de la 0. Fa cumva astfel incat sa ramana unde a fost -- ✅ Cand am video ul in fata, fa cumva sa pot da pauza apasand space -# la DVS: -1. ✅ Sterge acest paragraf: -Pașii, în ordine: se calculează AT·A; valorile ei proprii, ordonate descrescător, dau prin radical valorile singulare din S; vectorii proprii ortonormați ai aceleiași matrice sunt coloanele lui V; primele k coloane ale lui U ies din ui = (1/si)·A·vi, iar restul se completează cu direcții ortogonale pe ele. Ce rămâne, dacă rămâne un singur lucru: toată descompunerea unei matrice oarecare se obține din valorile și vectorii proprii ai unei singure matrice simetrice, AT·A. +# De schimbat la Newton-Cotes: +Probleme Persistente: +e descentrata partea de sub grafic: SubintervaleN 4h = 0,7854. 4 ar trebui sa stea langa N -# la QR: -1. ✅ Refa IN ANIMATIE scrisul din casutele de text, de sub explicarea parametriilor, ar trebui sa ma uit cu lupa ca sa il vad(toate scrisurile pentru explicatie, vreau sa fie mai mari). De asemenea, explica ca P2 vine de la b2, de la modul in care luam rotatia Givens astfel incat sa scapam de elementul b2 de sub diagonala principala(scrie pe scurt, nu incarca prea mult imaginea). -2. ✅ Schimba inapoi in teta din alfa in animatie sinusurile si cosinusurile -3. ✅ Scoate acest text: -"Aici e toată strategia metodei: nu se caută valorile proprii, ci se strâng spre zero capetele subdiagonalei, b2 și bn, până când cifra de lângă ele devine citibilă ca valoare proprie. -Dacă un bj din mijloc se anulează, cu 2 < j < n, matricea se rupe și problema se sparge în două mai mici — una de dimensiune j − 1 și una de dimensiune n − j + 1 — cărora li se aplică QR separat.", cu tot cu b2 = 0 => .... si ce e scris in acel chenar pe lanaga asta -# la LU: -1. ✅ Rezolva animatia la LU astfel incat sa nu se mai puna partea portocalie cu scris peste matrice(la secunda 9, acest scris: n + 1 = 4 determinanți, doar pentru n = 3) -2. ✅ (era deja exact în forma cerută) Rescrie aceste paragrafe, astfel: -- Un sistem A·x = b se poate rezolva cu determinanți — și nu se face niciodată așa: costul crește ca n!. Metodele directe merg pe alt drum: descompun A în două matrice triunghiulare, A = L·U, iar sistemul se sparge în două sisteme care se rezolvă prin simplă substituție, fiecare în O(n2). -3. ✅ Sterge aceste paragrafe: -- La n = 10, N = 360.000.000 de operații. Metodele de mai departe sunt de ordinul O(n3): la n = 20, 8.000 de operații față de 2,4·1018 cerute de un singur determinant. -4. ✅ Scoate zona de interactiv -# la Householder si Givnens: -1. ✅ La animatia Householder: -- Fa cumva sa nu mai fie desenul peste titlu -- Cand prezinti prima oara axele +-||v||, nu pune ||v|| pe dreptul direct al axei, nu se vede deloc, pune-l mai sus putin. La fel si la P * v -- Subtitrarile pica peste +# De schimbat la Derivare Numerica: +La interactiv: +1. Fa mai mare graficul, acum e decentrat cu parametrii -2. ✅ La animatia Givens: -- teta-ul ramane in aer dupa ce dispare v. Rezolva -- nu scrie x impartit la r, y impartit la r. Scrie x / r, y / r -- La cadrul cu matricea, fa o tranzitie de la forma Givens cu cos si sin la valorile numerice aflate anterior -- Scoate partea cu G*A din cadrul mentionat mai sus, cel cu matricea, si pune in loc de "I, cu 4 schimbate" "Matricea identitate, cu 4 elemente schimbate". Jos nu mai pune nimic, la scrisul mic alb -- Cand arati cum functioneaza Givens pe acel exemplu, ia mai bine linia si coloana, tu ai luat 2 linii. De asemenea, incepe cu elementul de pe linia 2, coloana 1. Apoi elem de pe linia 3, coloana 1. Apoi restul -✅ In aceasta pagina vreau animatiile sa se contopeasca cu teoria. Dupa teoria Householder, vreau sa pui animatia pentru Householder, iar dupa teoria Givens, animatia pentru Givens +# De schimbat la interpolari: +La interactiv: +1. La Lagrange: imbina multiplicatorul cu polinomul doar intr-o singura linie, unde sa se vada frumos cum se schimba polinomul la mai multe puncte +2. La Neville: partea cu pasi fa-o sub grafic, nu ca parametru, sa se ruleze cu sagetele. Partea de grade scoate-o sub partea de derulare, iar in locul ei fa graficul mai mare. Scoate partea cu verticala punctului evaluat. Scoate P0n(x) +3. Scoate partea cu functia Runge de tot din interactiv +4. La Spline fa cumva sa se vada mai bine diferenta intre natural si tensionat. Scoate si max |s − f| +0,0200. Schimba functia de start daca e nevoie -La nivel de text: -- ✅ Sterge aceste paragrafe: - - (PTP = I, se verifică în trei rânduri de calcul) - - Ultima e semnătura unei oglinzi: o rotație are determinantul +1. Tot de aici iese și că P aplicată de două ori nu face nimic — o reflectare a reflectării - - De ce contează care dintre cele două. Cu semnul celălalt, d = v − ‖v‖·e1 devine o scădere între numere aproape egale exact când v e deja aproape de axă — iar atunci cifrele semnificative se pierd. Pe v = (1; 10−10; 0), alegerea din formulă ține ‖d‖ = 2, iar cea opusă o prăbușește la 10−10: oglinda ajunge să fie definită de zgomot. Regula generală e că v și reflexia lui trebuie să fie depărtate. Prima coloană are norma 3, deci d = (5; 1; 2), iar reflexia o duce în (−3; 0; 0). Amândouă zerourile apar odată — asta e ce deosebește metoda: o transformare pe coloană, nu pe element. La pasul următor, d primește zerouri deasupra poziției de lucru. Nu e un detaliu de implementare: așa liniile de deasupra rămân neatinse, iar zerourile făcute la pasul dinainte nu se strică. Pentru o matrice m×n ajung min(m − 1, n) reflexii. (scoate inclusiv acea matrice) - - Poziția în matrice se citește simplu: linia care se anulează dă unde stă sin θ. La descompunerea QR, perechea de linii e chiar poziția elementului de anulat — se merge de jos în sus pe fiecare coloană, ca zerourile deja făcute să nu fie atinse. - - Matricea de la Givens - - Primul element de anulat e sub un 0 de pe diagonală, deci cos θ = 0 și sin θ = −1: rotația de un sfert de tură care schimbă cele două linii între ele. E cel mai scurt exemplu că rotația nu „calculează" nimic, doar așază. -- ✅ Schimba acest paragraf (Care dintre ele, și când -Aceeași țintă, două socoteli diferite: una ieftină pe matrice pline, cealaltă paralelizabilă și blândă cu zerourile. +# La Eliminare Gaussiana si pivotari +La interactiv: adu pe aceeasi linie a(ip) si matricea, mareste simbolul de la a(ip) si mareste per total matricea si linia cu pivotii -Câte transformări. Householder cere una pe coloană, deci de ordinul n. Givens cere una pentru fiecare element de sub diagonală, deci de ordinul n2/2 — un ordin de mărime mai mult, și fiecare cu radicalul ei. Pe matricea 3×3 din exemple: două reflexii față de trei rotații. -Ce câștigă totuși rotația. O rotație atinge exact două linii, deci mai multe rotații care lucrează pe perechi de linii diferite se pot face în același timp. Și, mai important, nu strică zerourile care există deja: pe o matrice rară, unde majoritatea elementelor sunt nule, ea plătește doar pentru cele câteva care nu sunt, în timp ce reflexia amestecă toată coloana. -Regula practică e chiar asta: Householder pentru matrice pline, Givens pentru matrice rare. Restul — ortogonalitatea, păstrarea normei, stabilitatea numerică — e comun; nu de acolo se alege.), tot acest paragraf, cu textul scris ca un Fun Fact: "Regula practică e chiar asta: Householder pentru matrice pline, Givens pentru matrice rare. Restul — ortogonalitatea, păstrarea normei, stabilitatea numerică — e comun; nu de acolo se alege" - -La nivel de interfata grafica: -✅ Pe Householder: -- daca maresc cercul la maxim nu se mai vede d -- P * v nu se vede fiindca sta direct pe axa -- pune intr-un chenar fiecare valoare, cat da -(‖v‖ 2,2361 -d (4,236; 1,000) -P·v (-2,236; 0) -det(P) −1) le ele ma refer -- "Ce se vede trăgând - -Oricât ai muta vectorul, imaginea lui rămâne pe axă, la aceeași distanță de origine ca el — asta înseamnă că transformarea păstrează norma. Când v traversează axa verticală, semnul lui v1 se schimbă și oglinda sare dintr-o parte în alta: e chiar alegerea de semn care ține d departe de zero." -Pune partea asta sub legenda - -Pe Givens: -- ✅ verifica daca cercul e ous bine, in cadranul 1 mie imi da cu -, s-ar putea sa fi inversat cercul - (verificat: cercul e corect, iar minusul e corect — vezi nota de mai jos) - - -# Jacobi, Gauss-Seidel, SOR: -De scos: -- ✅ Toata interfata grafica -- ✅ La text: -1. partea cu aratarea matricii pe exemplu A, D, L, U -2. Aceeași despărțire, pe un sistem concret. Se verifică dintr-o privire: D − L − U pune fiecare element înapoi de unde a venit, cu semnul lui original. -3. Tot box-ul cu "Când converge și cât de repede" -4. Merită schimbul? De obicei da, și se vede pe cifre. Pe primul sistem al paginii, Jacobi are ρ = 0,6072 și termină în 33 de iterații, iar Gauss-Seidel ρ = 0,4082 și 23. Pe al doilea sistem, diferența nu mai e de viteză, ci de existență: ρ(Jacobi) = 1 exact, deci eroarea nu se micșorează niciodată — vectorul oscilează la nesfârșit —, în timp ce Gauss-Seidel ajunge la soluție în 20 de iterații. Nu e o regulă: există sisteme pe care Jacobi converge și Gauss-Seidel nu. -5. Cât de bun e ω optim nu se poate calcula. Se caută încercând, iar pe cele două sisteme ale paginii răspunsul e chiar diferit ca semn: pe cel dominant diagonal, cel mai bun ω e subunitar — 0,935, adică subrelaxare —, iar suprarelaxarea strică lucrurile până la divergență, pe la ω ≈ 1,47. Pe al doilea, cel mai bun e 1,08, deci suprarelaxare. Câștigul pe sisteme mici e de o iterație-două; el crește cu dimensiunea sistemului, și de aceea metoda se folosește când ai de rezolvat multe sisteme cu aceeași matrice: cauți ω o dată și îl refolosești. -6. Tot box-ul cu "Când se oprește" - - -De schimbat: -- ✅ Fa acel tabel cu formule mai spatiat si mai mare, scrie metoda cu M mare -La animatie: -- ✅ Verifica daca matricea din exemplu respecta conditia de dominant diagonala - (verificat: e cea din curs, §10 problema 3; dominanta e slabă, nu strictă — - linia 2 are |4| = 1 + 3. Ambele metode converg oricum: ρ = 0,6072 și 0,4082. - Animația nu afirma nicăieri dominanța, deci nu era nimic greșit pe ecran.) -- ✅ De verificat corectitudinea sagetilor -- ✅ De scris corect si frumos semnele (de exemplu x^(0) are niste spatii in plus) -- ✅ Transforma zecimalele in fractii -- ✅ Schimba subtitrarea "Coloana din stanga nu se schimba tot baleiajul" cu ceva mai consecvent, nu se intelege ce ai vrut sa zici -- ✅ Partea cu "Eroarea se inmulteste cu p la fiecare pas" poti sa o scoti si sa faci mai frumos desenata acea pagina, cam in stilul animatiei de la LU, cand vorbeam de Cramer vs LU -- ✅ la SOR, aeriseste pagina, sunt prea inghesuite acolo, nu prea se intelege nimic. De asemenea, fa si mai frumoasa animatia. Fa un fade-in, fa un efect - - -# Derivare numerica: -De scos: -- ✅ ANIMATIA TOTAL -- ✅ Graficul acela cu eroarea din Interactiv -LA TEXT: ✅ -- Din cele șase formule care ies din calcul rămân doar două distincte: înlocuind h cu −h, celelalte se transformă una într-alta. Pentru derivata a doua se procedează identic și iese f″(x0) ≈ [f(x0−h) − 2f(x0) + f(x0+h)] / h2, cu eroarea −(h2/12)·f(4)(ξ). -- Toată pagina e despre ce înseamnă „destul de mic" — fiindcă, spre deosebire de ce ne-am aștepta, mai mic nu înseamnă mai bun. - de la paragraful de inceput -- Tot box-ul cu "de ce nu merge H oricat de mic - - -DE SCHIMBAT: -- La interactiv: -- ✅ Vreau valorile de la parametrii sa fie in chenare, functiile sa nu fie asa imprastiate, sa le aleg eu dintr-un drop-down -- ✅ Restrange Doua puncte inainte si inapoi doar in doua puncte, simplu. Poti alege ca reprezentare, doua puncte inainte, dar scrie sus doar "Doua puncte" -- ✅ Lucreaza mult pe functii, daca lasam asa nu se intelege nimic, eu nu inteleg nimic din exemplele tale. Vino cu ceva mai bun si care sa arate mai bine diferenta intre ele - - -# Curbe Bezier: -1. ✅ Partea de Interfata interactiva: -- ca aici(https://www.desmos.com/calculator/cahqdxeshd), doar ca simplificat. Vreau sa se vada pe pasi cum se construieste, sa pun eu acel p de la algoritmul lui Casteljau, iar abia la final sa pot sa ma joc asa cu ea. De asemenea, ca parametru, pune numarul de puncte si acel p. Fa cu multe culori, sa se distinga clar cum se construieste. -- nu pune formula - -2. ✅ Partea de Teorie: -- la fel ca in celelalte pagini, cum scrie in Claude.md -- Explica trecerea de la curbe Hermite la Bezier, importanta lor, ca formula pune mai mult despre polinoamele Bernstein si algoritmul lui deCasteljau - -3. ✅ Partea de Vizual: -- Vreau sa explici doar pasii de rezolvare a algoritmului de Casteljau, cum se formeaza, si apoi sa te joci putin cu o curba Bezier - - -Cuadraturi Adaptive si Gaussiene: -- fa doar partea de interactiv si teorie, unde vom folosi la interactiv pozele date in cursuri_MN/poze. Reprodu tipul acela de grafic, fa-l foarte mare, fa-l partea centrala, aeriseste-l, nu-l umple cu formule, si fa un slot pentru cuadraturile Gaussiene, iar altul pentru cuadraturile Adaptive. Fa cumva ca utilizatorul sa inteleaga importanta acestor metode prin mai multe exemple, fiecare ajutand la intelegerea mai profunda a plusurilor acestor metode pe anumite functii si ce rau ar fi daca nu le-ar fi folosit - - -ODE: -- aici fa doar partea de animatie si teorie, unde vreau sa te axezi mai mult pe Euler, apoi. Vreau sa incepi prin a arata importanta ODE, cum dintr-un punct si dintr o panta poti aproxima functia, cu ideea aceea a albiei de rau din poze, apoi sa treci la Euler si celelalte metode, pe langa Euler celelalte fiind trecute mai mult in revista, cu maxim ceva esential despre fiecare in parte(poti pune putin mai mult accent pe RK4). Tot asa, animatia vreau sa fie mai mult un mod de intelegere vizuala, nu vreau sa fie umpluta cu formule, doar strictul necesar. \ No newline at end of file diff --git a/src/algorithms/curbe-bezier/bezier.ts b/src/algorithms/curbe-bezier/bezier.ts index 4739000..267ceba 100644 --- a/src/algorithms/curbe-bezier/bezier.ts +++ b/src/algorithms/curbe-bezier/bezier.ts @@ -50,11 +50,11 @@ export function bernstein(n: number, i: number, t: number): number { /** * Schema triunghiulară a algoritmului, **cu toate nivelurile păstrate**. * - * `niveluri[0]` sunt punctele de control, iar `niveluri[j][i]` e `P⁽ʲ⁾ᵢ` din + * `niveluri[0]` sunt punctele de control, iar `niveluri[j][i]` e `Pᵢ⁽ʲ⁾` din * recurența §16: * * ``` - * P⁽ʲ⁾ᵢ = (1 − t)·P⁽ʲ⁻¹⁾ᵢ + t·P⁽ʲ⁻¹⁾ᵢ₊₁ + * Pᵢ⁽ʲ⁾ = (1 − t)·Pᵢ⁽ʲ⁻¹⁾ + t·Pᵢ₊₁⁽ʲ⁻¹⁾ * ``` * * Ultimul nivel are un singur punct, care e chiar `B(t)`. Nivelurile @@ -120,7 +120,7 @@ export function esantioneazaCurba(puncte: readonly Punct[], esantioane = 120, pa /** * Derivatele pe care le înlocuiesc cele două puncte de control interioare: - * `P′₁ = 3(P₁ − P₀)` și `P′₂ = 3(P₃ − P₂)`. + * `P₁′ = 3(P₁ − P₀)` și `P₂′ = 3(P₃ − P₂)`. * * Asta e tot ce deosebește cele două scrieri ale aceleiași cubice: Hermite cere * două derivate, Bézier cere două puncte în plus — iar un punct se poate trage diff --git a/src/algorithms/derivare-numerica/functii-derivare.ts b/src/algorithms/derivare-numerica/functii-derivare.ts index d664259..db4415d 100644 --- a/src/algorithms/derivare-numerica/functii-derivare.ts +++ b/src/algorithms/derivare-numerica/functii-derivare.ts @@ -61,9 +61,7 @@ export const FUNCTII_DERIVARE: FunctieDerivare[] = [ f: (x) => x * x, fPrim: (x) => 2 * x, fSecund: () => 2, - ceArata: - "Punctul de mijloc dă chiar 2x, oricât de mare ar fi h — ce rămâne pe ecran e doar " + - "rotunjirea mașinii. Cele două puncte greșesc cu exact h.", + ceArata: "Curbura e aceeași peste tot, deci eroarea nu depinde de unde se calculează.", x0: 1, }, { diff --git a/src/algorithms/registry.ts b/src/algorithms/registry.ts index 2d184e6..9f2334e 100644 --- a/src/algorithms/registry.ts +++ b/src/algorithms/registry.ts @@ -144,7 +144,7 @@ export const ALGORITMI: IntrareAlgoritm[] = [ { slug: "eliminare-gaussiana", numar: 3, - titlu: "Eliminare gaussiană și pivotări", + titlu: "Eliminare Gaussiană", capitol: "sisteme-liniare", descriere: "Eliminarea gaussiană văzută pe matrice, plus ce aduce în plus și cât costă fiecare tip de pivotare.", @@ -156,10 +156,10 @@ export const ALGORITMI: IntrareAlgoritm[] = [ { slug: "algoritmul-thomas", numar: 4, - titlu: "Algoritmul Thomas (sisteme tridiagonale)", + titlu: "Algoritmul Thomas", capitol: "sisteme-liniare", descriere: - "Aceeași eliminare, dar pe trei diagonale: patru vectori în loc de o matrice și O(n) operații în loc de O(n³).", + "Frumusețea sistemelor tridiagonale și optimizarea pe care o aduc, văzută prin aplicarea algoritmului Thomas pe o matrice aleasă aleator.", metode: [ "Sisteme tridiagonale", "Eliminare înainte", @@ -177,7 +177,7 @@ export const ALGORITMI: IntrareAlgoritm[] = [ { slug: "metode-iterative", numar: 5, - titlu: "Jacobi, Gauss-Seidel, SOR", + titlu: "Metode iterative pentru rezolvarea sistemelor de ecuații liniare", capitol: "sisteme-liniare", descriere: "Trei moduri de a te apropia de soluție prin repetiție, cu formula alături de matricea care se schimbă la fiecare pas.", @@ -191,7 +191,7 @@ export const ALGORITMI: IntrareAlgoritm[] = [ { slug: "ecuatii-neliniare", numar: 6, - titlu: "Puncte fixe, bisecție, Newton, secantă", + titlu: "Rezolvarea ecuațiilor neliniare", capitol: "ecuatii-optimizare", descriere: "Cauți rădăcina unei funcții pe un interval: alegi metoda, tragi de capete și vezi cât de repede se strânge fiecare.", @@ -219,13 +219,16 @@ export const ALGORITMI: IntrareAlgoritm[] = [ { slug: "metodele-puterii", numar: 8, - titlu: "Metodele puterii, Rayleigh, deflație", + titlu: "Metodele Puterii", capitol: "valori-proprii", descriere: "Cum scoate o simplă înmulțire repetată valoarea proprie dominantă și cum ajungi la celelalte, prin puterea inversă și deflație.", metode: ["Metoda puterii", "Puterea inversă", "Iterarea Rayleigh", "Deflație"], dificultate: "greu", cursSursa: ["valori_vectori_proprii_teorie_curs7.md"], + // Pagina se sprijină pe clip și pe teorie; interfața interactivă a fost + // construită și scoasă prin decizie, deci secțiunea nu se pune deloc. + interactiv: false, gata: false, }, { @@ -234,7 +237,7 @@ export const ALGORITMI: IntrareAlgoritm[] = [ titlu: "Algoritmul PageRank", capitol: "valori-proprii", descriere: - "Importanța unei pagini web ca vector propriu pentru λ = 1 al matricei Google — adică metoda puterii, aplicată pe un graf de linkuri.", + "Metoda puterii, aplicată pe un graf de linkuri. Secretele din spatele algoritmului care a impactat Google, descris pas cu pas.", metode: ["Matrice stocastică", "Matricea Google", "Metoda puterii", "Deflație pe blocuri"], dificultate: "mediu", cursSursa: ["valori_vectori_proprii_teorie_curs7.md"], @@ -246,7 +249,7 @@ export const ALGORITMI: IntrareAlgoritm[] = [ { slug: "algoritmul-qr", numar: 10, - titlu: "Algoritmul QR și valorile proprii", + titlu: "Algoritmul QR", capitol: "valori-proprii", descriere: "Ce înseamnă de fapt Q și R și de ce, repetând factorizarea, matricea se apropie de o formă din care se citesc toate valorile proprii deodată.", @@ -276,7 +279,7 @@ export const ALGORITMI: IntrareAlgoritm[] = [ titlu: "Descompunerea valorilor singulare (DVS)", capitol: "valori-proprii", descriere: - "Orice matrice, chiar și dreptunghiulară, se scrie ca o rotație, o întindere pe axe și încă o rotație — de unde ies valorile singulare și la ce sunt bune.", + "Orice matrice, chiar și dreptunghiulară, se scrie ca o rotație, o întindere pe axe și încă o rotație.", metode: [ "DVS", "SVD", @@ -297,7 +300,7 @@ export const ALGORITMI: IntrareAlgoritm[] = [ { slug: "interpolare-polinomiala", numar: 12, - titlu: "Lagrange, Neville, funcția Runge, spline", + titlu: "Interpolări polinomiale", capitol: "interpolare-aproximare", descriere: "Îți alegi punctele, iar polinomul le trece prin toate — până când funcția Runge arată de ce era nevoie de spline-uri.", @@ -309,10 +312,10 @@ export const ALGORITMI: IntrareAlgoritm[] = [ { slug: "curbe-bezier", numar: 13, - titlu: "Curbe Bézier, algoritmul de Casteljau", + titlu: "Curbe Bézier. Algoritmul de Casteljau", capitol: "interpolare-aproximare", descriere: - "Tragi de punctele de control și curba te urmează: construcția de Casteljau, în plan și în spațiu.", + "Tragi de punctele de control și curba te urmează: construcția algoritmului de Casteljau, pas cu pas.", metode: ["Curbe Bézier", "Polinoame Bernstein", "de Casteljau", "2D / 3D"], dificultate: "ușor", cursSursa: ["interpolare_spline_bezier_teorie_curs09.md"], @@ -323,8 +326,7 @@ export const ALGORITMI: IntrareAlgoritm[] = [ numar: 14, titlu: "Transformata Fourier rapidă (FFT)", capitol: "interpolare-aproximare", - descriere: - "Cum coboară interpolarea trigonometrică de la 4m² operații la O(m log m): coeficienții complecși și pasul de înjumătățire.", + descriere: "Cum coboară interpolarea trigonometrică de la 4m² operații la O(m log m).", metode: [ "FFT", "Cooley-Tukey", @@ -345,7 +347,7 @@ export const ALGORITMI: IntrareAlgoritm[] = [ titlu: "Derivare numerică", capitol: "integrare-ode", descriere: - "Panta tangentei, aproximată prin panta unei secante: ce câștigi micșorând pasul h și de unde apare eroarea de rotunjire.", + "Formulele importante ale aproximării derivatelor, explicate printr-o interfață interactivă.", metode: [ "Formula two-point", "Derivare înainte", @@ -362,10 +364,10 @@ export const ALGORITMI: IntrareAlgoritm[] = [ { slug: "newton-cotes", numar: 16, - titlu: "Newton-Cotes: trapeze și Simpson", + titlu: "Metodele Newton-Cotes: formula trapezelor și formula Simpson", capitol: "integrare-ode", descriere: - "Aria de sub grafic, aproximată pe noduri echidistante cu trapeze și cu parabole, plus ce câștigă formulele compuse.", + "Cum calculăm aria de sub grafic, aproximată pe noduri echidistante cu trapeze și parabole.", metode: [ "Cuadratură numerică", "Newton-Cotes", @@ -386,7 +388,7 @@ export const ALGORITMI: IntrareAlgoritm[] = [ { slug: "cuadraturi-adaptive-si-gaussiene", numar: 17, - titlu: "Cuadraturi adaptive și cuadraturi Gaussiene", + titlu: "Cuadraturi Adaptive și Gaussiene", capitol: "integrare-ode", descriere: "Unde își împarte Simpson intervalul când eroarea e prea mare și de ce nodurile Gaussiene nu sunt echidistante.", diff --git a/src/components/content/AnimatiaBezier.tsx b/src/components/content/AnimatiaBezier.tsx index 3901dcf..7a28237 100644 --- a/src/components/content/AnimatiaBezier.tsx +++ b/src/components/content/AnimatiaBezier.tsx @@ -376,7 +376,7 @@ function Desen() { puncte={nivelurileConstructiei[1] ?? []} rol={CULORI_NIVEL[1]!} opacitate={intra(T, N + 1.6, 0.5)} - etichete={["P⁽¹⁾₀", "P⁽¹⁾₁", "P⁽¹⁾₂"]} + etichete={["P₀⁽¹⁾", "P₁⁽¹⁾", "P₂⁽¹⁾"]} st={st} /> diff --git a/src/components/content/AnimatiaEliminariiGaussiene.tsx b/src/components/content/AnimatiaEliminariiGaussiene.tsx index 7ba8436..2fadeb3 100644 --- a/src/components/content/AnimatiaEliminariiGaussiene.tsx +++ b/src/components/content/AnimatiaEliminariiGaussiene.tsx @@ -782,33 +782,38 @@ function Desen() { opacitate={intra(T, t0 + 3.4, 0.5)} st={st} /> + {/* Multiplicatorul stă **între** cei doi vectori, nu peste primul. + Scris centrat la 128 și cu 34 de unități, „− 1 ·" se întindea de la + 85 la 171, adică peste coloana din stânga, care se termină la 104. + Aici centrul e la mijlocul golului dintre ele, iar corpul e cât + încape în gol. */} @@ -425,7 +432,7 @@ function Desen() { {/* ═══ 3 · mai multe noduri ═══ */} - + {/* Curba dinainte se stinge în timp ce cea nouă intră: schimbarea de treaptă se vede ca o mișcare, nu ca o tăietură. */} - + + {/* Formula stă mai mare decât înainte și mai depărtată de cifră: la + 28 de unități se citea ca o notă de subsol a numărului, deși ea + spune ce anume e numărul. */} {valoare.eticheta} + {/* Trei zecimale, nu șase: aici se urmărește **spre ce** urcă câtul, + iar ultimele trei cifre se schimbau prea repede ca să se citească. + Cifra e și puțin mai mică, ca să nu strivească formula de deasupra. */} = cue.Inversa ? "interval" : "curent")} - style={{ font: `800 ${64 * Math.min(st, 1.2)}px var(--font-mono)` }} + style={{ font: `800 ${54 * Math.min(st, 1.2)}px var(--font-mono)` }} > - {virgula(valoare.valoare, 6)} + {virgula(valoare.valoare, 3)} )} @@ -482,13 +488,13 @@ function Panou({ T, cue, st }: { T: number; cue: Cue; st: number }) { {[ { text: `λ₁ = ${VALORI_PLANE[0]}`, - sub: "metoda puterii, iterarea Rayleigh", + sub: "Metoda puterii, iterarea Rayleigh", rol: "solutie" as const, y: PY + LATIME_MATRICE + 120, }, { text: `λ₂ = ${VALORI_PLANE[1]}`, - sub: "puterea inversă", + sub: "Puterea inversă", rol: "interval" as const, y: PY + LATIME_MATRICE + 250, }, diff --git a/src/components/content/Callout.tsx b/src/components/content/Callout.tsx index b8b7752..8306b3c 100644 --- a/src/components/content/Callout.tsx +++ b/src/components/content/Callout.tsx @@ -48,11 +48,15 @@ export function Callout({ tip = "nota", titlu, children, className }: CalloutPro const Icon = stil.icon; return ( -