Skip to content
Snippets Groups Projects
Commit c7c4330d authored by jakle's avatar jakle
Browse files

2nd commit:added notebook on output

parent 5ac653ad
No related branches found
No related tags found
No related merge requests found
%% Cell type:markdown id: tags:
<font size="5"><center>
Kursus: 01005 Matematik 1 \
Forfatter: Jakob Lemvig \
Email: jakle@dtu.dk
</font></center>
%% Cell type:code id: tags:
``` python
from sympy import *
init_session()
```
%% Output
IPython console for SymPy 1.11.1 (Python 3.10.6-64-bit) (ground types: python)
These commands were executed:
>>> from sympy import *
>>> x, y, z, t = symbols('x y z t')
>>> k, m, n = symbols('k m n', integer=True)
>>> f, g, h = symbols('f g h', cls=Function)
>>> init_printing()
Documentation can be found at https://docs.sympy.org/1.11.1/
%% Cell type:markdown id: tags:
# Hvordan arbejder man videre med output/løsninger i SymPy?
Man kommer tit ud for at skulle arbejde videre med output eller en løsning i SymPy. Fx hvis man bliver bedt om at angive en løsning ud af uendeligt mange løsninger. Lad os kigge på nogle typiske eksempler.
%% Cell type:markdown id: tags:
## Egenvektorer
Vi ønsker ofte at arbejde videre med egenvektorer af en matrix, men det kan hurtigt blive besværligt at skrive alle (lin. uafh.) egenvektorerne ind manuelt. Hvis man bruger `eigenvects`-metoden gemmer SymPy al information i en liste:
%% Cell type:code id:c43ae7ec tags:
``` python
A = Matrix([[6,2,4],[2,9,-2],[4,-2,6]])
ev = A.eigenvects()
display(ev, type(ev))
```
%% Output
$\displaystyle \left[ \left( 1, \ 1, \ \left[ \left[\begin{matrix}-1\\\frac{1}{2}\\1\end{matrix}\right]\right]\right), \ \left( 10, \ 2, \ \left[ \left[\begin{matrix}\frac{1}{2}\\1\\0\end{matrix}\right], \ \left[\begin{matrix}1\\0\\1\end{matrix}\right]\right]\right)\right]$
%% Cell type:markdown id: tags:
`eigenvects()` giver altså en liste af tuples, hvor egenvektorerne gemmes på plads 2 i hver tuple. Vi kan derfor gemme alle egenvektorerne i en liste af vektorer på følgende måde:
%% Cell type:code id: tags:
``` python
list_of_ev = []
[list_of_ev.extend(ev[k][2]) for k in range(0,len(ev))]
list_of_ev
```
%% Output
$\displaystyle \left[ \left[\begin{matrix}-1\\\frac{1}{2}\\1\end{matrix}\right], \ \left[\begin{matrix}\frac{1}{2}\\1\\0\end{matrix}\right], \ \left[\begin{matrix}1\\0\\1\end{matrix}\right]\right]$
⎡⎡-1 ⎤ ⎡1/2⎤ ⎡1⎤⎤
⎢⎢ ⎥ ⎢ ⎥ ⎢ ⎥⎥
⎢⎢1/2⎥, ⎢ 1 ⎥, ⎢0⎥⎥
⎢⎢ ⎥ ⎢ ⎥ ⎢ ⎥⎥
⎣⎣ 1 ⎦ ⎣ 0 ⎦ ⎣1⎦⎦
%% Cell type:markdown id: tags:
Eller som matrix:
%% Cell type:code id: tags:
``` python
Matrix(A.shape[0],len(list_of_ev),Matrix((list_of_ev))).T
```
%% Output
$\displaystyle \left[\begin{matrix}-1 & \frac{1}{2} & 1\\\frac{1}{2} & 1 & 0\\1 & 0 & 1\end{matrix}\right]$
⎡-1 1/2 1⎤
⎢ ⎥
⎢1/2 1 0⎥
⎢ ⎥
⎣ 1 0 1⎦
%% Cell type:markdown id: tags:
Hvis vi gerne vil arbejde videre med egenvektorerne som søjler i en matrix, er det meget nemmere at bruge `diagonalize` metoden:
%% Cell type:code id:789ade26 tags:
``` python
V, Lamda = A.diagonalize()
V, Lamda
```
%% Output
$\displaystyle \left( \left[\begin{matrix}-2 & 1 & 1\\1 & 2 & 0\\2 & 0 & 1\end{matrix}\right], \ \left[\begin{matrix}1 & 0 & 0\\0 & 10 & 0\\0 & 0 & 10\end{matrix}\right]\right)$
⎛⎡-2 1 1⎤ ⎡1 0 0 ⎤⎞
⎜⎢ ⎥ ⎢ ⎥⎟
⎜⎢1 2 0⎥, ⎢0 10 0 ⎥⎟
⎜⎢ ⎥ ⎢ ⎥⎟
⎝⎣2 0 1⎦ ⎣0 0 10⎦⎠
%% Cell type:markdown id:9f7a8935 tags:
## Et lineært ligningssystem med flere løsninger
Vi ønsker at løse det inhomogene ligningssystem:
%% Cell type:code id: tags:
``` python
x1,x2,x3 = symbols('x1:4')
eq1 = Eq(-x2 + x3, 2)
eq2 = Eq(2*x1 + 4*x2 - 2*x3, 2)
display(eq1, eq2)
```
%% Output
$\displaystyle - x_{2} + x_{3} = 2$
$\displaystyle 2 x_{1} + 4 x_{2} - 2 x_{3} = 2$
%% Cell type:markdown id: tags:
hvis totalmatrix er givet ved
%% Cell type:code id:57c54709 tags:
``` python
A, b = linear_eq_to_matrix([eq1, eq2], [x1, x2, x3])
T = A.row_join(b)
display(T)
```
%% Output
$\displaystyle \left[\begin{matrix}0 & -1 & 1 & 2\\2 & 4 & -2 & 2\end{matrix}\right]$
%% Cell type:markdown id:34345904 tags:
Det kan løses direkte ved brug af SymPy på flere forskellige måder:
%% Cell type:code id:6b058e32 tags:
``` python
sols1 = A.gauss_jordan_solve(b)
sols2 = linsolve(T)
sols3 = solve([eq1,eq2])
display(sols1,sols2,sols3)
```
%% Output
$\displaystyle \left( \left[\begin{matrix}5 - \tau_{0}\\\tau_{0} - 2\\\tau_{0}\end{matrix}\right], \ \left[\begin{matrix}\tau_{0}\end{matrix}\right]\right)$
$\displaystyle \left\{\left( 5 - \tau_{0}, \ \tau_{0} - 2, \ \tau_{0}\right)\right\}$
$\displaystyle \left\{ x_{1} : 5 - x_{3}, \ x_{2} : x_{3} - 2\right\}$
%% Cell type:markdown id: tags:
**Vi forestiller os at vi gerne vil angive den løsning, hvor den frie parameter er lig med $4$.** Vi bemærker først at løsningerne gemmes i forskellige data-typer, så det er svært at lave en generel metode:
%% Cell type:code id: tags:
``` python
type(sols1), type(sols2), type(sols3)
```
%% Output
(tuple, sympy.sets.sets.FiniteSet, dict)
%% Cell type:code id: tags:
``` python
sols2.kind
```
%% Output
SetKind(TupleKind(NumberKind, NumberKind, NumberKind))
%% Cell type:markdown id: tags:
Vi prøver:
%% Cell type:code id: tags:
``` python
display(sols1[0])
# sols1[0].subs(tau0,4) # Fejlmeddelelse: NameError: name 'tau0' is not defined
```
%% Output
$\displaystyle \left[\begin{matrix}5 - \tau_{0}\\\tau_{0} - 2\\\tau_{0}\end{matrix}\right]$
%% Cell type:markdown id: tags:
men 'tau0' er ikke defineret. Vi kan undersøge sagen nærmere med:
%% Cell type:code id: tags:
``` python
srepr(sols1[0])
```
%% Output
"MutableDenseMatrix([[Add(Integer(5), Mul(Integer(-1), Symbol('tau0')))], [Add(Symbol('tau0'), Integer(-2))], [Symbol('tau0')]])"
%% Cell type:markdown id: tags:
Vi ser at 'tau0' faktisk hedder `Symbol('tau0')`, så en mulighed er:
%% Cell type:code id: tags:
``` python
sols1[0].subs(Symbol('tau0'),4)
```
%% Output
$\displaystyle \left[\begin{matrix}1\\2\\4\end{matrix}\right]$
⎡1⎤
⎢ ⎥
⎢2⎥
⎢ ⎥
⎣4⎦
%% Cell type:markdown id:2c05071d tags:
### Brug af `free_symbol`-metoden:
Vi kan mere generelt få fat i de frie variable ved `free_symbols`-metoden:
%% Cell type:code id: tags:
``` python
# sols1
sols1_as_tuple = Tuple(*sols1)
var1_as_tuple = Tuple(*sols1_as_tuple.free_symbols)
display(sols1_as_tuple, var1_as_tuple)
```
%% Output
$\displaystyle \left( \left[\begin{matrix}5 - \tau_{0}\\\tau_{0} - 2\\\tau_{0}\end{matrix}\right], \ \left[\begin{matrix}\tau_{0}\end{matrix}\right]\right)$
$\displaystyle \left( \tau_{0},\right)$
%% Cell type:code id: tags:
``` python
# sols2
sols2_as_tuple = Tuple(*sols2)
var2_as_tuple = Tuple(*sols2_as_tuple.free_symbols)
display(sols2_as_tuple, var2_as_tuple)
```
%% Output
$\displaystyle \left( \left( 5 - \tau_{0}, \ \tau_{0} - 2, \ \tau_{0}\right),\right)$
$\displaystyle \left( \tau_{0},\right)$
%% Cell type:code id: tags:
``` python
# sols3 er en dictionary, så den skal tilgås ved:
display(tuple(sols3.keys()),tuple(sols3.values()))
```
%% Output
$\displaystyle \left( x_{1}, \ x_{2}\right)$
$\displaystyle \left( 5 - x_{3}, \ x_{3} - 2\right)$
%% Cell type:code id: tags:
``` python
# sols3
sols3_as_tuple = Tuple(*sols3.values()) # bemærk `values`-metoden bruges
var3_as_tuple = Tuple(*sols3_as_tuple.free_symbols)
display(sols3_as_tuple, var3_as_tuple)
```
%% Output
$\displaystyle \left( 5 - x_{3}, \ x_{3} - 2\right)$
$\displaystyle \left( x_{3},\right)$
%% Cell type:markdown id: tags:
**Lad os samle det i én kommando:**
%% Cell type:code id: tags:
``` python
# virker både for sols1 og sols2, mens sols3 kræver sols3.values()
sols = linsolve((A,b)) # or sols = A.gauss_jordan_solve(b)
var = Tuple(*Tuple(*sols).free_symbols)
display(Tuple(*sols)[0])
Tuple(*sols)[0].subs(var[0],4)
```
%% Output
$\displaystyle \left( 5 - \tau_{0}, \ \tau_{0} - 2, \ \tau_{0}\right)$
$\displaystyle \left( 1, \ 2, \ 4\right)$
(1, 2, 4)
%% Cell type:markdown id: tags:
Det er lige til at generalisere dette til tilfælde med flere frie variable. Prøv.
/home/jakle/Python/pilot-project-for-01005/Konvertering af Notebook til PDF.ipynb
\ No newline at end of file
%% Cell type:markdown id: tags:
Af Christian Mikkelstrup, Hans Henrik Hermansen og Jakob Lemvig
%% Cell type:markdown id: tags:
# Generelt om aflevering af eksamens- og hjemmeopgaver
Først et par kommentarer om afleveringer i 01005 Matematik 1:
> <font size="6">**Hvis alt går galt til eksamen, så aflever blot en tom PDF og `ipynb`-filen som bilag**
> Den "tomme" PDF bør henvise til bilaget og forklare at I ikke kunne eksportere til PDF.</font>
> <font size="6">Gør jeres matematik **reproducerbar**. Det kan gøres ved at vedhæfte jeres Notebook i `ipynb`-format som bilag til jeres hjemmeafleveringer. Hvis I skriver selve afleveringen direkte som en Notebook, er dette trin selvfølgelig ikke nødvendigt.
</font>
%% Cell type:markdown id: tags:
# Konvertering af Notebooks
I denne notebook bliver der først gennemgået installationen, hvorefter 3 metoder til eksportering præsenteres, hvormed man kan exportere sin fine Jupyter Notebook til et pdf dokument. Der vil være en *simpel metode*, som vil være fremgangsmåden for klart de fleste af jer, en *advanceret metode*, hvis I vil have endnu mere kontrol over hvordan jeres pdf ser ud, eller en metode der altid virker (men dog ikke er lige så pæn). Dette er vigtigt til aflevering af hjemmeopgaverr, da disse skal afleveres som pdf (.ipynb filer godtages ikke). I kan passende exportere dette dokument (eller enhver af demoerne) for at teste at jeres exportering virker!
%% Cell type:markdown id: tags:
# Installering
Før vi kan begynde at eksportere dokumenter, er det krævet at installere 2-3 ting. Først skal vi bruge **pandoc**, som er et værktøj til at konverterer mellem forskellige dokument-formater. Det kan hentes på link: [https://pandoc.org/installing.html](https://pandoc.org/installing.html). Derudover skal vi bruge **LaTeX**. Download er specifik til styresystemet, så Windows systemer skal bruge [MikTex](https://miktex.org), Mac systemer skal bruge [MacTex](https://tug.org/mactex/) og Linux systemer skal bruge [Tex Live](https://tug.org/texlive/). Endelig vil det være nyttigt at installere [nbconvert](https://nbconvert.readthedocs.io/en/latest/), da det giver mulighed for konvertering af Notebooks via terminalen.
## Noter for nbconvert installation
- **Installation**: Åben først en terminal (fra toolbar: Terminal > New Terminal (eller ctrl+shift+\`). Kør: `pip install nbconvert` eller `conda install nbconvert`, se denne [guide](https://nbconvert.readthedocs.io/en/latest/install.html)
- The command-line **syntax** to run the nbconvert script is:
```
jupyter nbconvert --to FORMAT notebook.ipynb
```
This will convert the Jupyter notebook file notebook.ipynb into the output format given by the FORMAT string.
## Noter for LaTeX installation
### Linux
Guiden under [Tex Live](https://tug.org/texlive/) er ret god (tl;dr: Unix(ish)), men vi skulle notere/justere 3 ting:
- Step 4: i stedet for stjerne, skulle vi skrive hvad cifre der var kommer til mappen. Man kan finde ud af hvilke mapper og filer der ligger hvor man er nu ved at skrive ``ls`` i kommandovinduet.
- Step 5: Her skulle vi skrive ``sudo`` og mellemrum før resten af linjen for at den kunne køre. Dette krævede også at man indtaster koden til computeren.
- Step 6: De beder dig her om at tilføje den til din PATH. Måden det har virket for os er ved at åbne ".bashrc" i "/home/" (gemt fil) og tilføje linjen nederst: ``PATH="/usr/local/texlive/2022/bin/x86_64-linux:$PATH"``
### Ekstra for Mac og Windows
Sørg for at notere stien hvori programmet downloades. Når programmet er installeret, så sørg for at åbne programmet og downloade eventuelle optateringer, hvis du bliver bedt om det (Eksempelvis i MiKTeX, hvor en knap siger "Check for updates", og så kan man trykke på "Update now" under "Updates" fanen). For Windows og Mac skal stien til det downloadede program tilføjes til "PATH" (gør så python kan bruge LaTeX kommandoerne):
- For Windows kan man søge efter "Rediger systemmiljøvariablerne" ("Edit the system environment variables" på engelsk) og vælge "Miljøvariabler" ("Environment Variables"). Derefter kan man under "Brugervariabler" dobbeltklikke på "Path" ("User variables" og "PATH"). Inde på denne meny skal man trykke "Ny" ("New") og indsætte stien til hvor man har downloaded filen i formatet (med "DOWNLOADPATH" erstattet med jeres sti): ``DOWNLOADPATH\MiKTeX\miktex\bin\x64\`` Nu kan du trykke på "OK" på alle de åbnede vinduer for at lukke dem igen.
- For Mac kan man tilføje programmet til "PATH" ved brug af én kommando fra kommandolinjen: ``export PATH=/Library/TeX/texbin:$PATH``
Når installationen er færdig er det krævet, at du genstarter Visual Studio Code før du kan eksportere til PDF.
%% Cell type:markdown id: tags:
# Eksportering
## Kort om de forskellige løsninger
### Brug af GUI i VS Code
1. PDF via $\LaTeX$: Ctrl-Shift-P (Linux/Windows) eller Cmd-Shift-P (Mac) og skriv "**Export to PDF**". Alternativt: Tryk på $\cdots$ i toolbaren lige over notebooken og vælg "eksport -> PDF".
1. PDF via HTML: Ctrl-Shift-P (Linux/Windows) eller Cmd-Shift-P (Mac) og skriv "**Export to HTML**". Alternativt: Tryk på $\cdots$ i toolbaren lige over notebooken og vælg "eksport -> HTML". Åben derefter HTML-filen i en browser og vælg "Print -> Print to PDF".
### Brug af nbconvert fra terminalen (uafhængigt af VS Code)
Ved længere rapporter er det nyttigt at eksportere jeres Notebook til en LaTeX-fil (se 1. nedenfor). Ved kortere afleveringer bør I eksportere til PDF (se 2. og 3. nedenfor). Vi skal først åbne en terminal eller command prompt. I VS Code kan i vælge Terminal > New Terminal. I terminalen skal vi derefter navigere til den folder/mappe/bibliotek hvor Notebooken ligger, fx `cd Mat1-opgaver`. Derefter kalder vi `jupyter nbconvert` fra terminalen på følgende måder:
1. Direkte til $\LaTeX$: `jupyter nbconvert --to latex notebook.ipynb`. Herefter til PDF via: `xelatex notebook.tex`
1. Direkte til PDF via LaTeX: `jupyter nbconvert --to pdf notebook.ipynb`
1. Til PDF via HTML `jupyter nbconvert --to html notebook.ipynb`. Åben derefter HTML-filen i en browser og vælg "Print -> Print to PDF".
%% Cell type:markdown id: tags:
## Mere information om eksport til PDF via LaTeX (fra GUI i VS Code)
Du skal åbne filen du gerne vil have eksporteret til pdf. Inde på filen kan du søge efter kommandoen (Man finder søge-baren ved Ctrl-Shift-P eller Cmd-Shift-P på Mac) "**Export to PDF**". Du får her mulighed for at vælge hvor din pdf skal gemmes. Det kan godt tage noget tid før den bliver færdig med at eksportere.
Noter ved eksport ved denne metode:
- Det kan give mening at have det første i dokumentet være forfatteren (lavet af), da dette er det første der kommer ind under den automatisk genererede overskrift.
- Overskriften i pdf-dokumentet bliver navnet på notebook filen.
- Der bliver automatisk lavet afsnit eller underafsnit når man i markdown har indsat "#" eller "##" (eller "###").
- Specielle symboler kan nogle gange forsvinde. Eksempelvis kommer de fancy *Shift* og *Cmd* for Mac ikke med hvis man eksporterer "Intro-SymPy.ipynb". Overvej om man kan skrive deres navn i stedet for.
%% Cell type:markdown id: tags:
## Mere information om advanceret eksport til PDF
Hvis man gerne vil have mere kontrol over layoutet i den resulterende pdf, skal man åbne en terminal i mappen hvor jupyter notebook'en ligger. Dette kan gøres i Visual Studio Code under "Terminal -> New Terminal", og (hvis ikke kommandoen ``pwd`` viser den rigtige sti) skrive ``cd "den_fulde_sti_indsættes_her"``. Herefter skrives følgende kommando (med "notebook" erstattet med notebook'ens navn)
`jupyter nbconvert notebook.ipynb --to latex`
Dette laver en række nye filer i samme mappe som notebook'en, hvoraf én af dem gerne skal være en ".tex" fil med samme navn som notebook'en. Denne LaTeX fil skal så åbnes i det downloadede LaTeX system (MikTex, MacTex eller Tex Live). Man kan også arbejde videre med denne fil på [Overleaf](https://www.overleaf.com/), men da denne mulighed bruger internet, kan dette ikke bruges til eksamen.
Nu kan man så justere ved den rå LaTeX kildekode før man kompilerer dokumentet! Her er et par detaljer som vi har brugt eller noteret ved denne metode:
- Standard formatet ved brug af denne metode, hvis der ikke gøres mere, er præcis det samme som den simple eksportering.
- Man kan ændre overskriften i PDF'en ved at finde og justere den linje i dokumentet hvor der står ``\title{notebook_title_here}``.
- Hvis man gerne vil indsætte forfattere i den auto-genererede overskrift, kan man i linjen under titlen indsætte følgende linje: ``\author{my_name_here}``
- Man kan fjerne tallene før overskrifterne ved at finde de steder hvor der står ``\section{header}`` (eller ``\subsection{header}`` og ``\subsubsection{header}``) og erstatte med ``\section*{header}`` (eller ``\subsection*{header}`` og ``\subsubsection*{header}``).
- Det er ikke altid at den kompilerer. Eksempelvis kan "Intro-SymPy.ipynb" dokumentet ikke kompileres uden justeringer, da det indeholder fancy versioner af *shift* og *command* for mac. Man kan eksempelvis komme rundt om dette problem ved at skrive ``Cmd`` og ``Shift`` i stedet for. I den simple version fjernede den helt bare symbolerne i stedet for at smide en fejl. Dette er bare en advarsel om, at du bliver bedt om at gøre noget, hvis den støder på problemer.
- I linux kan man kompilere sit dokument ved at navigere til et kommandovindue hen til den korrekte sti, hvorefter man kører kommandoen ``xelatex filename.tex``
%% Cell type:markdown id: tags:
## Hvis alt andet fejler
Eksportering fra notebook til latex er stadig ret nyt, så man kan ende i en situation hvor ens flotte notebook bare ikke vil eksportere, også selvom det ser godt ud i Visual Studio Code. Hvis det ikke virker når man sidder til eksamen, eller man ikke orker bruge mere tid på det, skal du følge disse instruktioner!
Inde på filen kan du søge efter kommandoen "**Export to HTML**". Du får her mulighed for at vælge hvor filen skal gemmes. Hvis dette ikke virker, så prøv `jupyter nbconvert --to html notebook.ipynb` i terminalen. Herefter skal du åbne den nye ".html" fil i en browser (den bruger ikke internet på trods af at det er en browser). Du kan nu vælge at "printe" siden, og som printer vælge "Gem som PDF" ("Save as PDF").
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment