Enhed 5 / 11

Numerisk beregning, Python og kodegenerering

Gevinster:

  • Evne til at skelne mellem symbolsk og numerisk beregning og vælge det rigtige værktøj (SymPy eller NumPy/SciPy) til hver opgave
  • Evne til at læse og forstå den numeriske kode produceret af kunstig intelligens, køre den selv og verificere den ved at udføre en sund fornuftstest med et kendt input.
  • Forstå grænserne for præcision af flydende komma-tal, brug tolerance i stedet for nøjagtig lighed, og administrer virkningen af ​​indledende gætter på numeriske metoder.

Symbolsk regning giver den nøjagtige formel for et integral eller en ligning; Men de fleste praktiske problemer i matematik kan ikke løses med en lukket formel. Det er her, numerisk beregning kommer i spil: at producere et omtrentligt numerisk resultat med den ønskede præcision snarere end en nøjagtig formel. At finde værdien af ​​et integral til 0,001 præcision, at beregne roden af ​​en ligning til decimal tilnærmelse, at udtrække statistik fra et datasæt - disse er alle numeriske beregninger. I Python er værktøjerne til dette bibliotekerne NumPy (numeriske arrays og matematik) og SciPy (scientific computing). I denne enhed lærer du at bruge AI som en assistent, der genererer Python-kode til numerisk beregning og kontrollere kodens rigtighed.

En kritisk definition: et flydende decimaltal er et format, hvor en computer gemmer decimaltal med begrænset præcision. Derfor kan 0,1 + 0,2 i computeraritmetik vise sig at være 0,300000000000000004, ikke ligefrem 0,3. Dette er ikke en fejl, det er karakteren af ​​numerisk beregning - men det vil føre til forkerte resultater, hvis du ikke er klar over det. I numerisk udregning arbejder man med "tæt nok" frem for "præcis lighed".

Symbolsk eller numerisk? At vælge det rigtige værktøj

Status

Symbolsk (SymPy)

Numerisk (NumPy/SciPy)

Der er en lukket formel

foretrækkes

ikke nødvendigt

Ingen formel/for kompleks

ikke kan løse

foretrækkes

Fuldstændig præcision påkrævet

Ja

Ca.

Big data / multi-processing

langsom

meget hurtigt

Resultatet med decimal er tilstrækkeligt

passende

En god praktiserende læge bruger begge dele: løs symbolsk, hvis det er muligt, gå numerisk, hvis ikke, og krydstjek det ene med det andet, når det er muligt.

Trin for trin: Sikker numerisk beregning med AI

1. Identificer problemet og følsomheden. "Hvor mange decimaler?" og "i hvilket område?" Afklar dine spørgsmål.

2. Skriv kode til AI, ikke output. Husk fra enhed 4: Lav ikke AI-forudsigelseskodeoutput. Du kører koden.

3. Læs og forstå koden. Forstå den genererede kode linje for linje. Det rigtige bibliotek, den rigtige funktion, de rigtige parametre? Kør ikke kode, du ikke forstår.

4. Test med en kendt situation. Prøv koden med et simpelt input, som du allerede kender svaret på. For eksempel sin(0)=0, ligesom værdien af ​​et kendt integral. Hvis koden giver den korrekt, vil du stole mere på den.

5. Krydstjek symbolsk eller manuelt. Hvis det er muligt, bekræft det samme resultat med SymPy eller en manuel tilgang.

6. Pas på floating point-fælder. I stedet for streng lighed med ==, brug tolerancer som abs(a - b) < 1e-9.

Tip: Test altid en numerisk kode "med et svar, du kender". Hvis du skrev en rodfinder, skal du først anvende den på en ligning med en kendt rod (x=±2), såsom x²−4=0. Hvis koden finder dette korrekt, bliver det mere sandsynligt, at den er pålidelig på ligninger, du ikke kender. Denne "sanity check" er den billigste verifikation.

Faldgruben ved numerisk beregning: konvergens og fejlakkumulering.

De fleste numeriske metoder fungerer iterativt: starter fra et indledende gæt og nærmer sig gradvist det faktiske svar. Denne proces med at komme tættere på kaldes konvergens. Men ikke enhver iterativ metode konvergerer altid; nogle divergerer (bevæger sig væk fra resultatet) eller konvergerer til en forkert værdi. Hvis en AI-genereret kode ikke kontrollerer, om metoden konvergerer, kan den stille og roligt give dig et forkert nummer. Så bare fordi et numerisk resultat "producerede et tal", gør det ikke sandt; Det er også nødvendigt at bekræfte, at dette tal faktisk konvergerer til den søgte løsning.

En anden subtilitet er fejlakkumulering. I en lang kæde af beregninger kan små floating-point afrundingsfejl ved hvert trin akkumulere og blive større; Især når du tager forskellen på to meget tætte store tal (dette kaldes katastrofal annullering), kan betydelige cifre i resultatet gå tabt. Kunstig intelligens forudsiger ikke altid sådanne numeriske stabilitetsproblemer. I kritiske beregninger afslører genberegning og sammenligning af resultatet med en anden metode eller med højere præcision skjult fejlakkumulering.

Bemærk: "At give et resultat" og "konvergere til det korrekte resultat" af en numerisk metode er to forskellige ting. Sørg for, at koden inkluderer et konvergenstjek (f.eks. at forskellen mellem to på hinanden følgende trin bliver lille nok); Hvis den ikke indeholder det, skal du få den kunstige intelligens til at tilføje denne kontrol.

tre minisager

Tilfælde 1 — Forkert funktionsvalg. En studerende bad AI om kode for at finde roden til en funktion. AI brugte scipy.optimize.fsolve, men valgte et dårligt indledende gæt og konvergerede til den forkerte rod. Eleven undersøgte først funktionen ved at tegne den grafisk (se visualiseringsenhed), gav det korrekte indledende gæt og fandt den rigtige rod. Lektion: numeriske rodfindere er følsomme over for udgangspunktet.

Tilfælde 2 — Floating point-fælde. En ingeniør kørte en AI-kode, der skrev hvis 0,1 + 0,2 == 0,3: og indså, at betingelsen aldrig var sand. AI havde ignoreret floating point-præcision. Koden blev rettet med abs((0.1+0.2) - 0.3) < 1e-9. 1e-9 betyder "ti til minus ni", en meget lille tolerance.

Case 3 - Test af sund fornuft fangede fejlen. En lærer modtog kode fra scipy.integrate.quad, der numerisk beregner et bestemt integral. Han testede det først med et kendt integral såsom ∫₀¹ x dx = 0,5; koden gav 0,5. Derefter beregnede han det faktiske integral og bekræftede resultatet med SymPy. Han stolede på, når to uafhængige metoder gav det samme resultat. Samlet tid: 6 minutter.

Fire kopierbare skabeloner

1) Anmodning om en numerisk kontokode:

Skriv Python-kode, der løser følgende problem NUMERISK: [problem]. Brug NumPy/SciPy. Følsomhed: [f.eks. 6 decimaler]. Jeg vil køre koden; forudsige output. Forklar kort i en kommentarlinje, hvilken funktion du har valgt og hvorfor.

2) Tilføjelse af en sund fornuftstest:

Tilføj en sund fornuftskontrol til denne kode for at teste dens RIGTIGTIGHED, før du kører den: prøv det med et simpelt input, hvor svaret allerede er kendt (f.eks. root ±2 for x²-4=0), og kontroller, at det giver det forventede resultat.Kode: [her]

3) Symbolsk-numerisk krydstjek:

Skriv kode, der løser følgende integral/ligning med BÅDE SymPy (symbolsk) OG SciPy (numerisk): [problem]. Print de to resultater ud, så jeg kan sammenligne dem. Tilføj en linje, der tjekker for forskelle med abs().

4) Flydende kommasikkerhed:

Gennemgå sammenligningerne af flydende decimaltal i denne kode. Hvis der er strenge '=='-ligheder, skal du erstatte dem med en passende tolerance (abs(a-b) < 1e-9) og forklare hvorfor. Kode: [her]

Svag prompt / Stærk prompt

Svag: "Find roden til denne ligning: x³ − 2x − 5 = 0. Skriv svaret."
Resultat: AI’en passer til et decimaltal (f.eks. "2.0946..."). Det kan være sandt eller ikke; Det er ikke blevet bekræftet, fordi det ikke er blevet kørt.
Kraftig: "Skriv en kode, der finder den reelle rod af ligningen x³ − 2x − 5 = 0 med SciPy. For det indledende gæt skal du først angive intervallet, hvor funktionen skifter fortegn. Tilføj en linje, der erstatter roden og kontroller, at resultatet er ~0. Jeg vil se output."
Resultat: Eksekverbar kode, nøjagtigt indledende gæt, indbyggede hashes. Gyldigheden af ​​roden er bevist.

Almindelige fejl

  • Stol på resultatet uden at køre koden. Det numeriske output, som AI'en "forudsiger", er ikke validering.
  • Test af flydende komma-lighed med `==`. Det er næsten altid forkert; Brug tolerance.
  • Dårlig indledende prognose. Numeriske rod/optimeringsmetoder er følsomme over for udgangspunktet; Det kan konvergere til den forkerte rod.
  • Udtrykker ikke følsomhed. "Hvor mange skridt?" Hvis det ikke bliver spurgt, passer resultatet muligvis ikke til behovet.
  • Tager ikke en sund fornuftstest. Det er risikabelt at anvende kode på et reelt problem uden at teste det med et kendt input.
  • Kører koden uden at forstå den. Kode, du ikke forstår, bruger muligvis den forkerte funktion; forstå hver linje.
Forsigtig: Numeriske resultater er altid omtrentlige. I stedet for at sige "resultatet er præcis dette", så sig "det er præcis det". I en teknisk eller videnskabelig rapport er det en del af nøjagtigheden at angive den anvendte metode og præcision. Det er misvisende at præsentere et omtrentligt resultat som endeligt.

Sammenfattende

Numerisk beregning giver omtrentlige, men praktiske resultater for problemer, der ikke kan løses med lukket formel; I Python er dets værktøjer NumPy og SciPy. AI genererer hurtigt kode til disse biblioteker, men du skal køre koden, læse og forstå den og teste den med kendt input. Vær forsigtig med præcision med flydende komma: Brug tolerance frem for nøjagtig lighed. Krydstjek symbolske og numeriske metoder, hvis det er muligt. Sund fornuftstest og substitution er de billigste og mest effektive verifikationer.

Ansøgningsopgave

Vælg et problem, der er svært at løse med en lukket formel (f.eks. roden x³ − 2x − 5 = 0, eller den bestemte værdi af et ikke-elementært integral). Få AI til at udskrive både den numeriske kode og, hvis det er muligt, den symbolsk-numeriske krydstjekkode med skabelon 1 og 3. Kør koden i et rigtigt Python-miljø. Lav først en sund fornuftstest med et kendt input, og løs derefter det faktiske problem. Sørg for at bruge tolerancer, hvis der er en flydende komma sammenligning. Bemærk resultatet sammen med dets følsomhed.

tjekliste

  • [ ] Jeg identificerede problemet og den nødvendige følsomhed.
  • [ ] Jeg læste og forstod koden produceret af AI'en linje for linje.
  • [ ] Jeg kørte koden i et rigtigt Python-miljø.
  • [ ] Jeg lavede en sund fornuftstest med et kendt input.
  • [ ] Jeg har tilføjet et symbolsk/manuel krydstjek, hvis det er muligt.
  • [ ] Jeg brugte tolerance i sammenligninger med flydende komma.