I'm done 😂😂😂😂
This commit is contained in:
parent
278cc7f1fc
commit
d14dc840d1
7 changed files with 793 additions and 5 deletions
8
l2/1.jl
8
l2/1.jl
|
@ -61,10 +61,10 @@ function sumvectorsdecreasing(x::Vector{T}, y::Vector{T})::T where T <: Abstract
|
|||
s[i] = x[i] * y[i]
|
||||
end
|
||||
|
||||
spos::Vector{T} = s[s .> 0]
|
||||
spos::Vector{T} = s[s .> zero(T)]
|
||||
sort!(spos, rev = true)
|
||||
|
||||
sneg::Vector{T} = s[s .<= 0]
|
||||
sneg::Vector{T} = s[s .<= zero(T)]
|
||||
sort!(sneg)
|
||||
|
||||
neg::T = zero(T)
|
||||
|
@ -99,10 +99,10 @@ function sumvectorsincreasing(x::Vector{T}, y::Vector{T})::T where T <: Abstract
|
|||
s[i] = x[i] * y[i]
|
||||
end
|
||||
|
||||
spos::Vector{T} = s[s .> 0]
|
||||
spos::Vector{T} = s[s .> zero(T)]
|
||||
sort!(spos)
|
||||
|
||||
sneg::Vector{T} = s[s .<= 0]
|
||||
sneg::Vector{T} = s[s .<= zero(T)]
|
||||
sort!(sneg, rev = true)
|
||||
|
||||
neg::T = zero(T)
|
||||
|
|
12
l2/2.jl
12
l2/2.jl
|
@ -6,7 +6,17 @@ import Pkg
|
|||
Pkg.add("Plots")
|
||||
using Plots
|
||||
|
||||
f(x::Float64)::Float64 = exp(x) * log(one(Float64) + exp(-x))
|
||||
"""
|
||||
f(x::Float64)::Float64
|
||||
|
||||
Calculate `e^x * ln(1 + e^-x)`.
|
||||
|
||||
# Arguments
|
||||
- `x::Float64`: argument of the function
|
||||
"""
|
||||
function f(x::Float64)::Float64
|
||||
return exp(x) * log(one(Float64) + exp(-x))
|
||||
end
|
||||
|
||||
x = range(-10, 40, length=1000)
|
||||
y = map(x -> f(x), x)
|
||||
|
|
17
l2/3.jl
17
l2/3.jl
|
@ -7,11 +7,28 @@ using LinearAlgebra
|
|||
include("hilb.jl")
|
||||
include("matcond.jl")
|
||||
|
||||
"""
|
||||
Errors of the solutions for a system of linear equations
|
||||
for the Gauss and inverse matrix methods.
|
||||
|
||||
# Fields
|
||||
- `gauss::Float64`: the error for the Gauss method
|
||||
- `inverse::Float64`: the error for the inverse matrix method
|
||||
"""
|
||||
struct Errors
|
||||
gauss::Float64
|
||||
inverse::Float64
|
||||
end
|
||||
|
||||
"""
|
||||
solve(A::Matrix{Float64}, n::Int)::Errors
|
||||
|
||||
Solve the system of linear equations given by the matrix `A`.
|
||||
|
||||
# Arguments
|
||||
- `A::Matrix{Float64}`: the matrix
|
||||
- `n::Int`: size of the matrix
|
||||
"""
|
||||
function solve(A::Matrix{Float64}, n::Int)::Errors
|
||||
x::Vector{Float64} = ones(Float64, n)
|
||||
b::Vector{Float64} = A * x
|
||||
|
|
61
l2/4.jl
Executable file
61
l2/4.jl
Executable file
|
@ -0,0 +1,61 @@
|
|||
#!/usr/bin/env julia
|
||||
|
||||
# Jacek Poziemski 272389
|
||||
|
||||
import Pkg
|
||||
Pkg.add("Polynomials")
|
||||
using Polynomials
|
||||
|
||||
coefficients::Vector{Float64} = [1, -210.0, 20615.0,-1256850.0,
|
||||
53327946.0,-1672280820.0, 40171771630.0, -756111184500.0,
|
||||
11310276995381.0, -135585182899530.0,
|
||||
1307535010540395.0, -10142299865511450.0,
|
||||
63030812099294896.0, -311333643161390640.0,
|
||||
1206647803780373360.0, -3599979517947607200.0,
|
||||
8037811822645051776.0, -12870931245150988800.0,
|
||||
13803759753640704000.0, -8752948036761600000.0,
|
||||
2432902008176640000.0]
|
||||
|
||||
polynomial::Polynomial = Polynomial(reverse(coefficients))
|
||||
|
||||
polynomialroots::Vector{Float64} = roots(polynomial)
|
||||
|
||||
wilkinson::Polynomial = fromroots(polynomialroots)
|
||||
|
||||
println("P(n):")
|
||||
|
||||
for k in 1:20
|
||||
z_k::Float64 = polynomialroots[k]
|
||||
Pz_k::Float64 = abs(polynomial(z_k))
|
||||
pz_k::Float64 = abs(wilkinson(z_k))
|
||||
error::Float64 = abs(z_k - k)
|
||||
println("k: $k; z_k: $z_k; P(z_k): $Pz_k; p(z_k): $pz_k; error: $error")
|
||||
end
|
||||
|
||||
println()
|
||||
|
||||
wilkinsoncoefficients::Vector{Float64} = [1, -210.0 - 2.0^(-23.0), 20615.0,-1256850.0,
|
||||
53327946.0,-1672280820.0, 40171771630.0, -756111184500.0,
|
||||
11310276995381.0, -135585182899530.0,
|
||||
1307535010540395.0, -10142299865511450.0,
|
||||
63030812099294896.0, -311333643161390640.0,
|
||||
1206647803780373360.0, -3599979517947607200.0,
|
||||
8037811822645051776.0, -12870931245150988800.0,
|
||||
13803759753640704000.0, -8752948036761600000.0,
|
||||
2432902008176640000.0]
|
||||
|
||||
polynomialb::Polynomial = Polynomial(reverse(wilkinsoncoefficients))
|
||||
|
||||
polynomialbroots::Vector{ComplexF64} = roots(polynomialb)
|
||||
|
||||
wilkinsonb::Polynomial = fromroots(polynomialbroots)
|
||||
|
||||
println("p(n):")
|
||||
|
||||
for k in 1:20
|
||||
z_k::ComplexF64 = polynomialbroots[k]
|
||||
Pz_k::Float64 = abs(polynomialb(z_k))
|
||||
pz_k::Float64 = abs(wilkinsonb(z_k))
|
||||
error::Float64 = abs(z_k - k)
|
||||
println("k: $k; z_k: $z_k; P(z_k): $Pz_k; p(z_k): $pz_k; error: $error")
|
||||
end
|
84
l2/5.jl
Executable file
84
l2/5.jl
Executable file
|
@ -0,0 +1,84 @@
|
|||
#!/usr/bin/env julia
|
||||
|
||||
# Jacek Poziemski 272389
|
||||
|
||||
"""
|
||||
model(r::T, p::T)::T where T <: AbstractFloat
|
||||
|
||||
Calculate `p + rp(1 - p)` on a given IEEE 754 floating point type.
|
||||
|
||||
# Arguments
|
||||
- `r::T`: the first argument
|
||||
- `p::T`: the second argument
|
||||
"""
|
||||
function model(r::T, p::T)::T where T <: AbstractFloat
|
||||
return p + r * p * (one(T) - p)
|
||||
end
|
||||
|
||||
"""
|
||||
iter10trunciter30()::Vector{Float32}
|
||||
|
||||
Iterate on the model function 10 times, truncate
|
||||
the result and iterate 30 more times.
|
||||
"""
|
||||
function iter10trunciter30()::Vector{Float32}
|
||||
ret = Vector{Float32}()
|
||||
p::Float32 = 0.01
|
||||
r::Float32 = 3.0
|
||||
push!(ret, p)
|
||||
|
||||
for i in 1:10
|
||||
p = model(r, p)
|
||||
push!(ret, p)
|
||||
end
|
||||
|
||||
p = trunc(p, digits = 3)
|
||||
|
||||
for i in 1:30
|
||||
p = model(r, p)
|
||||
push!(ret, p)
|
||||
end
|
||||
|
||||
return ret
|
||||
end
|
||||
|
||||
"""
|
||||
iter40(T::Type{<: AbstractFloat})::Vector{T}
|
||||
|
||||
Iterate on the model function 40 times.
|
||||
|
||||
# Arguments
|
||||
- `T::Type{<: AbstractFloat}`: the IEEE 754 floating type to operate on
|
||||
"""
|
||||
function iter40(T::Type{<: AbstractFloat})::Vector{T}
|
||||
ret = Vector{T}()
|
||||
p::T = 0.01
|
||||
r::T = 3.0
|
||||
push!(ret, p)
|
||||
|
||||
for i in 1:40
|
||||
p = model(r, p)
|
||||
push!(ret, p)
|
||||
end
|
||||
|
||||
return ret
|
||||
end
|
||||
|
||||
p1::Vector{Float32} = iter40(Float32)
|
||||
p2::Vector{Float32} = iter10trunciter30()
|
||||
p3::Vector{Float64} = iter40(Float64)
|
||||
|
||||
println("1.")
|
||||
println()
|
||||
|
||||
for n in 1:41
|
||||
println("n: $(n - 1); 40 iter: $(p1[n]); trunc: $(p2[n])")
|
||||
end
|
||||
|
||||
println()
|
||||
println("2.")
|
||||
println()
|
||||
|
||||
for n in 1:41
|
||||
println("n: $(n - 1); Float32: $(p1[n]); Float64: $(p3[n])")
|
||||
end
|
57
l2/6.jl
Executable file
57
l2/6.jl
Executable file
|
@ -0,0 +1,57 @@
|
|||
#!/usr/bin/env julia
|
||||
|
||||
# Jacek Poziemski 272389
|
||||
|
||||
import Pkg
|
||||
Pkg.add("Plots")
|
||||
using Plots
|
||||
|
||||
"""
|
||||
seq(x::Float64, c::Float64)::Float64
|
||||
|
||||
Calculate `x^2 + c`.
|
||||
|
||||
# Arguments
|
||||
- `x::Float64`: the first argument
|
||||
- `c::Float64`: the second argument
|
||||
"""
|
||||
function seq(x::Float64, c::Float64)::Float64
|
||||
return x^2 + c
|
||||
end
|
||||
|
||||
cs::Vector{Float64} = [-2.0, -2.0, -2.0, -1.0, -1.0, -1.0, -1.0]
|
||||
xs::Vector{Float64} = [1.0, 2.0, 1.99999999999999, 1.0, -1.0, 0.75, 0.25]
|
||||
|
||||
"""
|
||||
exp(x::Float64, c::Float64)::Vector{Float64}
|
||||
|
||||
Iterate over the seq function 40 times.
|
||||
|
||||
# Arguments
|
||||
- `x::Float64`: the first argument
|
||||
- `c::Float64`: the second argument
|
||||
"""
|
||||
function exp(x::Float64, c::Float64)::Vector{Float64}
|
||||
ret::Vector{Float64} = []
|
||||
push!(ret, x)
|
||||
|
||||
for i in 1:40
|
||||
x = seq(x, c)
|
||||
push!(ret, x)
|
||||
end
|
||||
|
||||
return ret
|
||||
end
|
||||
|
||||
sequences::Vector{Vector{Float64}} = []
|
||||
|
||||
for i in 1:7
|
||||
sequence::Vector{Float64} = exp(xs[i], cs[i])
|
||||
push!(sequences, sequence)
|
||||
end
|
||||
|
||||
for i in 1:length(sequences)
|
||||
plot(title = "x_n² + c", xlabel = "n", ylabel = "x_n")
|
||||
plot!(0:40, sequences[i], label = "x = $(xs[i]), c = $(cs[i])", lw = 2)
|
||||
png("6.$i.png")
|
||||
end
|
559
l2/sprawozdanie.tex
Normal file
559
l2/sprawozdanie.tex
Normal file
|
@ -0,0 +1,559 @@
|
|||
\documentclass[a4paper]{article}
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage[polish]{babel}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage{amsmath}
|
||||
\usepackage{amssymb}
|
||||
\usepackage{adjustbox}
|
||||
\usepackage{longtable}
|
||||
\usepackage{siunitx}
|
||||
\usepackage{graphicx}
|
||||
\graphicspath{ {./} }
|
||||
|
||||
\title{Obliczenia naukowe – Lista 2}
|
||||
\author{Jacek Poziemski 272389}
|
||||
\date{10.11.2024}
|
||||
\begin{document}
|
||||
\maketitle
|
||||
|
||||
\textbf{Zad. 1}
|
||||
|
||||
Zadanie polega na powtórzeniu zadania 5. z listy 1.
|
||||
wprowadzając niewielkie zmiany danych, czyli na
|
||||
eksperymentalnym obliczaniu iloczynu skalarnego
|
||||
dwóch wektorów na 4 różne sposoby:
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
(a) w przód – od pierwszego do ostatniego elementu
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
(b) w tył – od ostatniego do pierwszego elementu
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
(c) od największego do najmniejszego – liczenie częściowych
|
||||
sum elementów dodatnich i ujemnych w porządku malejącym względem
|
||||
wartości absolutnej liczb, następnie dodanie do siebie sum częściowych
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
(d) od największego do najmniejszego – liczenie częściowych
|
||||
sum elementów dodatnich i ujemnych w porządku rosnącym względem
|
||||
wartości absolutnej liczb, następnie dodanie do siebie sum częściowych
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
używając typów zmiennopozycyjnych $Float32$ i $Float64$.
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
Poniżej przedstawiam dane i wyniki dla obu zadań:
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
Z5/L1:
|
||||
|
||||
\begin{gather*}
|
||||
x = [2.718281828, -3.141592654, 1.414213562, \boldsymbol{0.5772156649}, \boldsymbol{0.3010299957}] \\
|
||||
y = [1486.2497, 878366.9879, -22.37492, 4773714.647, 0.000185049]
|
||||
\end{gather*}
|
||||
|
||||
Poprawna wartość iloczynu skalarnego: $-1.00657107000000 \cdot 10^{-11}$
|
||||
|
||||
\begin{table}[h]
|
||||
\begin{adjustbox}{max width=\textwidth}
|
||||
\begin{tabular}{|c|c|c|}
|
||||
\hline
|
||||
Sposób & Wynik dla $Float32$ & Wynik dla $Float64$ \\ \hline
|
||||
(a) & -0.4999442994594574 & 1.0251881368296672e-10 \\
|
||||
(b) & -0.454345703125 & -1.5643308870494366e-10 \\
|
||||
(c) & -0.5 & 0.0 \\
|
||||
(d) & -0.5 & 0.0 \\
|
||||
\hline
|
||||
\end{tabular}
|
||||
\end{adjustbox}
|
||||
\end{table}
|
||||
|
||||
Z1/L2:
|
||||
|
||||
\begin{gather*}
|
||||
x = [2.718281828, -3.141592654, 1.414213562, \boldsymbol{0.577215664}, \boldsymbol{0.301029995}] \\
|
||||
y = [1486.2497, 878366.9879, -22.37492, 4773714.647, 0.000185049]
|
||||
\end{gather*}
|
||||
|
||||
Poprawna wartość iloczynu skalarnego: $-0.004296343192495245$
|
||||
|
||||
\begin{table}[h]
|
||||
\begin{adjustbox}{max width=\textwidth}
|
||||
\begin{tabular}{|c|c|c|}
|
||||
\hline
|
||||
Sposób & Wynik dla $Float32$ & Wynik dla $Float64$ \\ \hline
|
||||
(a) & -0.4999442994594574 & -0.004296342739891585 \\
|
||||
(b) & -0.454345703125 & -0.004296342998713953 \\
|
||||
(c) & -0.5 & -0.004296342842280865 \\
|
||||
(d) & -0.5 & -0.004296342842280865 \\
|
||||
\hline
|
||||
\end{tabular}
|
||||
\end{adjustbox}
|
||||
\end{table}
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
Wartości dla typu $Float32$ są identyczne do zadania 5. z listy 1.,
|
||||
ponieważ zmiany w wartościach są zbyt małe, $Float32$ przez zbyt
|
||||
małą precyzję traci cyfry które usunęliśmy z oryginalnych wartości.
|
||||
Z kolei zmiana wartości dla typu $Float64$ jest znaczna – wartości
|
||||
dla wszystkich sposobów są znacznie bliższe wartości poprawnej.
|
||||
Jest tak dlatego, że zadanie jest źle uwarunkowane – przy
|
||||
pisaniu go nie wzięto pod uwagę błędów spowodowanych
|
||||
przez zbyt małą precyzję typów zmiennopozycyjnych.
|
||||
|
||||
\vspace{0.5cm}
|
||||
|
||||
\textbf{Zad. 2}
|
||||
|
||||
Narysowanie wykresu funkcji $f(x) = e^x\ln(1 + e^{-x})$
|
||||
w dwóch programach do wizualizacji, obliczenie granicy funkcji
|
||||
$\lim_{x \to \infty} f(x)$, porównanie wykresu z obliczoną granicą.
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
Do rysowania wykresów wybrałem pakiet $Plots$ z języka Julia i silnik Wolfram Alpha.
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
Pakiet $Plots$ z języka Julia:
|
||||
|
||||
\includegraphics[scale=0.5]{2-julia-plots}
|
||||
|
||||
\newpage
|
||||
|
||||
Wolfram Alpha:
|
||||
|
||||
\includegraphics{2-wolfram}
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
Granica funkcji dla x dążącego do $\infty$ wynosi $1$.
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
Algorytm jest niestabilny numerycznie – dla $x \geq 32$
|
||||
wykres zaczyna odbiegać coraz bardziej od rzeczywistej
|
||||
granicy funkcji, po czym przy wartości około $37$ spada
|
||||
do $0$ i tam zostaje. Pierwsze zjawisko występuje z powodu
|
||||
eksponencjalnego wzrostu $e^x$ – mnożenie tej wartości z
|
||||
$ln(1 + e^{-x})$ powoduje utratę precyzji. $1 + e^{-x}$ wraz
|
||||
ze wzrostem $x$ dąży do $1$, przez co logarytm naturalny
|
||||
tej wartości dąży do $0$. Przez to najpierw funkcja oscyluje
|
||||
wokół $1$, następnie spada do $0$.
|
||||
|
||||
\vspace{0.5cm}
|
||||
|
||||
\textbf{Zad. 3}
|
||||
|
||||
Rozwiązywanie układu równań liniowych $Ax = b$ dla
|
||||
macierzy współczynników $A \in \mathbb{R}^{n \times n}$
|
||||
i wektora prawych stron $b \in \mathbb{R}^n$.
|
||||
Macierze są generowane za pomocą funkcji $hilb(n)$
|
||||
(macierz Hilberta stopnia $n$) oraz $matcond(n, c)$
|
||||
(macierz losowa stopnia $n$ z zadanym wskaźnikiem
|
||||
uwarunkowania $c$). Równanie jest rozwiązywane za
|
||||
pomocą eliminacji Gaussa ($x = A \setminus b$)
|
||||
oraz macierzy odwrotnej ($x = A^{-1}b$), porównywane
|
||||
są wyniki obu sposobów z dokładnym rozwiązaniem, czyli
|
||||
$x = (1, ..., 1)^T$, aby uzyskać błędy względne.
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
Poniżej przedstawiam tabele z wynikami opisanymi powyżej dla macierzy
|
||||
Hilberta i losowych. Uwarunkowanie jest liczone za pomocą funkcji
|
||||
$cond()$ z pakietu $LinearAlgebra$ języka Julia, rząd jest
|
||||
liczony funkcją $rank()$ z tego samego pakietu.
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
\newpage
|
||||
|
||||
Macierze Hilberta:
|
||||
|
||||
\begin{table}[h]
|
||||
\begin{adjustbox}{max width=\textwidth}
|
||||
\begin{tabular}{|c|c|c|c|c|}
|
||||
\hline
|
||||
n & Uwarunkowanie & Rząd & Błąd metody Gaussa & Błąd metody macierzy odwrotnej \\ \hline
|
||||
1 & 1.0 & 1 & 0.0 & 0.0 \\
|
||||
2 & 19.281470067903967 & 2 & 5.661048867003676e-16 & 1.1240151438116956e-15 \\
|
||||
3 & 524.0567775860627 & 3 & 8.351061872731819e-15 & 9.825526038180824e-15 \\
|
||||
4 & 15513.738738929662 & 4 & 4.2267316576255873e-13 & 3.9600008750140806e-13 \\
|
||||
5 & 476607.2502419338 & 5 & 1.256825919192874e-12 & 8.128168770215688e-12 \\
|
||||
6 & 1.495105864177819e7 & 6 & 1.5435074657413347e-10 & 1.0423794065751672e-10 \\
|
||||
7 & 4.753673568766496e8 & 7 & 6.520804933066021e-9 & 4.3299229851434615e-9 \\
|
||||
8 & 1.5257575563722723e10 & 8 & 3.6010489197068436e-7 & 4.0236799996435915e-7 \\
|
||||
9 & 4.9315332284138226e11 & 9 & 1.3216991540025553e-5 & 1.4626798972086921e-5 \\
|
||||
10 & 1.6024980732174455e13 & 10 & 0.0004194170177181955 & 0.00040714905218460087 \\
|
||||
11 & 5.224780779168285e14 & 10 & 0.01004906783345069 & 0.010645959401385671 \\
|
||||
12 & 1.6425917529444498e16 & 11 & 0.5502106922296848 & 0.6697890564301745 \\
|
||||
13 & 4.4936679531246986e18 & 11 & 70.1556197115221 & 82.66675811171989 \\
|
||||
14 & 3.2198422552156205e17 & 11 & 9.649642437452474 & 10.094732062453225 \\
|
||||
15 & 3.3660126672602944e17 & 12 & 692.4295360390742 & 715.740988667373 \\
|
||||
16 & 2.249940193352714e18 & 12 & 10.414656083840297 & 8.442143351389534 \\
|
||||
17 & 6.26204622473199e17 & 12 & 18.67581817300634 & 17.157982115668773 \\
|
||||
18 & 3.266632306940269e18 & 12 & 5.40548300394664 & 3.742412802776696 \\
|
||||
19 & 3.462302955915255e18 & 13 & 15.073941146224387 & 16.84769281513296 \\
|
||||
20 & 6.806966421072721e18 & 13 & 28.79267493699834 & 30.751202239608727 \\
|
||||
\hline
|
||||
\end{tabular}
|
||||
\end{adjustbox}
|
||||
\end{table}
|
||||
|
||||
Macierze losowe:
|
||||
|
||||
\begin{table}[h]
|
||||
\begin{adjustbox}{max width=\textwidth}
|
||||
\begin{tabular}{|c|c|c|c|c|c|}
|
||||
\hline
|
||||
n & c & Uwarunkowanie & Rząd & Błąd metody Gaussa & Błąd metody macierzy odwrotnej \\ \hline
|
||||
5 & $10^0$ & 1.0000000000000007 & 5 & 1.2161883888976234e-16 & 9.930136612989092e-17 \\
|
||||
5 & $10^1$ & 10.000000000000009 & 5 & 1.9229626863835638e-16 & 1.4043333874306804e-16 \\
|
||||
5 & $10^3$ & 999.9999999999479 & 5 & 1.2158944411806644e-14 & 1.7034743437620337e-14 \\
|
||||
5 & $10^7$ & 9.999999998942768e6 & 5 & 3.779858573658035e-11 & 7.001100940383748e-11 \\
|
||||
5 & $10^{12}$ & 1.0000358548219889e12 & 5 & 8.318028330255335e-6 & 2.412626388678268e-6 \\
|
||||
5 & $10^{16}$ & 6.7112223576348e15 & 4 & 0.1468248218117339 & 0.19241602267287927 \\
|
||||
10 & $10^0$ & 1.0000000000000007 & 10 & 3.293453726225543e-16 & 2.248030287623391e-16 \\
|
||||
10 & $10^1$ & 10.000000000000004 & 10 & 2.8737410463596867e-16 & 2.696722356863272e-16 \\
|
||||
10 & $10^3$ & 1000.0000000000464 & 10 & 2.804142933558009e-14 & 3.225353619740909e-14 \\
|
||||
10 & $10^7$ & 1.000000000299259e7 & 10 & 3.9859081581065853e-10 & 4.391207697689116e-10 \\
|
||||
10 & $10^{12}$ & 9.999295565588569e11 & 10 & 3.3540852774047696e-6 & 1.0634644618672672e-5 \\
|
||||
10 & $10^{16}$ & 1.3146979480124638e16 & 9 & 0.009734949899136553 & 0.07859235212474557 \\
|
||||
20 & $10^0$ & 1.0000000000000016 & 20 & 5.438959822042073e-16 & 4.3568297570458958e-16 \\
|
||||
20 & $10^1$ & 9.999999999999996 & 20 & 6.843874359417885e-16 & 6.995286129029383e-16 \\
|
||||
20 & $10^3$ & 1000.0000000000807 & 20 & 9.187657331404228e-15 & 3.275440170573378e-15 \\
|
||||
20 & $10^7$ & 9.99999999397263e6 & 20 & 2.1966900086249582e-10 & 1.7889092637261268e-10 \\
|
||||
20 & $10^{12}$ & 9.999571219238594e11 & 20 & 1.4222130831564009e-5 & 1.374375061162218e-5 \\
|
||||
20 & $10^{16}$ & 2.508476826100777e16 & 19 & 0.06010750951624971 & 0.10225127023966499 \\
|
||||
\hline
|
||||
\end{tabular}
|
||||
\end{adjustbox}
|
||||
\end{table}
|
||||
|
||||
Dla macierzy Hilberta oraz losowych wraz ze wzrostem uwarunkowania
|
||||
wzrasta również błąd dla obu metod. Z tabeli dla macierzy losowych widać
|
||||
również, że funkcja $cond()$ nie oblicza dokładnej wartości uwarunkowania,
|
||||
lecz jedynie ją przybliża. Dodatkowo wartości przez nią zwracane
|
||||
jak i wartości błędów dla obu metod zależą od mikroarchitektury procesora,
|
||||
prawdopodobnie ponieważ różne procesory inaczej aproksymują niektóre
|
||||
instrukcje assembly x86\_64.
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
Zadanie ma wysoki wskaźnik uwarunkowania, dla macierzy Hilberta wzrost
|
||||
stopnia macierzy mocno wpływa na wskaźnik uwarunkowania i co za tym
|
||||
idzie błędy dla obu metod. W macierzach losowych zachodzi to samo
|
||||
zjawisko, jednak wzrost błędów jest o wiele wolniejszy i nie monotoniczny.
|
||||
|
||||
\vspace{0.5cm}
|
||||
|
||||
\textbf{Zad. 4}
|
||||
|
||||
Obliczenie pierwiastków $z_k$ ($1 \leq k \leq 20$)
|
||||
wielomianu Wilkinsona w postaci naturalnej
|
||||
($P(x)$, podana na stronie) i iloczynowej
|
||||
($p(x)$, stworzona za pomocą funkcji $fromroots()$)
|
||||
oraz obliczenie $|P(z_k)|$, $|p(z_k)|$ i $|z_k - k|$.
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
Następnie powtórzenie tego eksperymentu, z
|
||||
współczynnikiem $-210$ zmienionym na $-210 - 2^{-23}$.
|
||||
|
||||
Pierwiastki zostały obliczone za pomocą funkcji $roots()$.
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
Wyniki dla oryginalnego wielomianu Wilkinsona:
|
||||
|
||||
\begin{table}[h]
|
||||
\begin{adjustbox}{max width=\textwidth}
|
||||
\begin{tabular}{|c|c|c|c|c|}
|
||||
\hline
|
||||
$k$ & $z_k$ & $|P(z_k)|$ & $|p(z_k)|$ & $|z_k - k|$ \\ \hline
|
||||
1 & 0.9999999999996989 & 35696.50964788257 & 368.50964789367345 & 3.0109248427834245e-13 \\
|
||||
2 & 2.0000000000283182 & 176252.60026668405 & 15996.60026439321 & 2.8318236644508943e-11 \\
|
||||
3 & 2.9999999995920965 & 279157.6968824087 & 100981.69690684375 & 4.0790348876384996e-10 \\
|
||||
4 & 3.9999999837375317 & 3.0271092988991085e6 & 252581.31017303217 & 1.626246826091915e-8 \\
|
||||
5 & 5.000000665769791 & 2.2917473756567076e7 & 152225.31504973918 & 6.657697912970661e-7 \\
|
||||
6 & 5.999989245824773 & 1.2902417284205095e8 & 4.441356137271629e6 & 1.0754175226779239e-5 \\
|
||||
7 & 7.000102002793008 & 4.805112754602064e8 & 4.510025884078405e7 & 0.00010200279300764947 \\
|
||||
8 & 7.999355829607762 & 1.6379520218961136e9 & 2.309311180467704e8 & 0.0006441703922384079 \\
|
||||
9 & 9.002915294362053 & 4.877071372550003e9 & 5.2519713947457147e8 & 0.002915294362052734 \\
|
||||
10 & 9.990413042481725 & 1.3638638195458128e10 & 1.4705597374927537e9 & 0.009586957518274986 \\
|
||||
11 & 11.025022932909318 & 3.585631295130865e10 & 2.257814747009822e9 & 0.025022932909317674 \\
|
||||
12 & 11.953283253846857 & 7.533332360358197e10 & 5.776283226748977e9 & 0.04671674615314281 \\
|
||||
13 & 13.07431403244734 & 1.9605988124330817e11 & 8.720084582957656e8 & 0.07431403244734014 \\
|
||||
14 & 13.914755591802127 & 3.5751347823104315e11 & 2.100530498133618e10 & 0.08524440819787316 \\
|
||||
15 & 15.075493799699476 & 8.21627123645597e11 & 9.0205643837176e10 & 0.07549379969947623 \\
|
||||
16 & 15.946286716607972 & 1.5514978880494067e12 & 1.1093925108150577e11 & 0.05371328339202819 \\
|
||||
17 & 17.025427146237412 & 3.694735918486229e12 & 5.420826950832621e11 & 0.025427146237412046 \\
|
||||
18 & 17.99092135271648 & 7.650109016515867e12 & 2.0817615965429592e12 & 0.009078647283519814 \\
|
||||
19 & 19.00190981829944 & 1.1435273749721195e13 & 4.420887520697798e12 & 0.0019098182994383706 \\
|
||||
20 & 19.999809291236637 & 2.7924106393680727e13 & 3.2780945625202856e12 & 0.00019070876336257925 \\
|
||||
\hline
|
||||
\end{tabular}
|
||||
\end{adjustbox}
|
||||
\end{table}
|
||||
|
||||
Wyniki dla wielomianu Wilkinsona ze zmienionym współczynnikiem:
|
||||
|
||||
\begin{table}[h]
|
||||
\begin{adjustbox}{max width=\textwidth}
|
||||
\begin{tabular}{|c|c|c|c|c|}
|
||||
\hline
|
||||
$k$ & $z_k$ & $|P(z_k)|$ & $|p(z_k)|$ & $|z_k - k|$ \\ \hline
|
||||
1 & 0.9999999999998357 + 0.0i & 20259.872313418207 & 5411.872313429985 & 1.6431300764452317e-13 \\
|
||||
2 & 2.0000000000550373 + 0.0i & 346541.4137593836 & 65453.413724836006 & 5.503730804434781e-11 \\
|
||||
3 & 2.99999999660342 + 0.0i & 2.2580597001197007e6 & 447115.71016096906 & 3.3965799062229962e-9 \\
|
||||
4 & 4.000000089724362 + 0.0i & 1.0542631790395478e7 & 2.0101490631149793e6 & 8.972436216225788e-8 \\
|
||||
5 & 4.99999857388791 + 0.0i & 3.757830916585153e7 & 1.0452670578285774e7 & 1.4261120897529622e-6 \\
|
||||
6 & 6.000020476673031 + 0.0i & 1.3140943325569446e8 & 5.2837387075878106e7 & 2.0476673030955794e-5 \\
|
||||
7 & 6.99960207042242 + 0.0i & 3.939355874647618e8 & 1.3630697385185716e8 & 0.00039792957757978087 \\
|
||||
8 & 8.007772029099446 + 0.0i & 1.184986961371896e9 & 5.478192020926859e8 & 0.007772029099445632 \\
|
||||
9 & 8.915816367932559 + 0.0i & 2.2255221233077707e9 & 1.2795423874534175e9 & 0.0841836320674414 \\
|
||||
10 & 10.095455630535774 - 0.6449328236240688i & 1.0677921232930157e10 & 1.8009361907024696e9 & 0.6519586830380407 \\
|
||||
11 & 10.095455630535774 + 0.6449328236240688i & 1.0677921232930157e10 & 1.8009361907024696e9 & 1.1109180272716561 \\
|
||||
12 & 11.793890586174369 - 1.6524771364075785i & 3.1401962344429485e10 & 8.297365882456215e9 & 1.665281290598479 \\
|
||||
13 & 11.793890586174369 + 1.6524771364075785i & 3.1401962344429485e10 & 8.297365882456215e9 & 2.0458202766784277 \\
|
||||
14 & 13.992406684487216 - 2.5188244257108443i & 2.157665405951858e11 & 6.221054312666306e10 & 2.518835871190904 \\
|
||||
15 & 13.992406684487216 + 2.5188244257108443i & 2.157665405951858e11 & 6.221054312666306e10 & 2.7128805312847097 \\
|
||||
16 & 16.73074487979267 - 2.812624896721978i & 4.850110893921027e11 & 5.844684792788262e11 & 2.9060018735375106 \\
|
||||
17 & 16.73074487979267 + 2.812624896721978i & 4.850110893921027e11 & 5.844684792788262e11 & 2.825483521349608 \\
|
||||
18 & 19.5024423688181 - 1.940331978642903i & 4.557199223869993e12 & 2.209747866910055e12 & 2.4540214463129764 \\
|
||||
19 & 19.5024423688181 + 1.940331978642903i & 4.557199223869993e12 & 2.209747866910055e12 & 2.0043294443099486 \\
|
||||
20 & 20.84691021519479 + 0.0i & 8.756386551865696e12 & 2.2517830621461324e13 & 0.8469102151947894 \\
|
||||
\hline
|
||||
\end{tabular}
|
||||
\end{adjustbox}
|
||||
\end{table}
|
||||
|
||||
Dla wielomianu bez modyfikacji pierwiastki mają wartości zbliżone
|
||||
rzeczywistym, jednak nie dokładne. Te błędne wartości oczywiście
|
||||
powodują błędy w wartościach obu wielomianów
|
||||
dla tych pierwiastków – $P(z_k)$ i $p(z_k)$.
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
Zmiana współczynnika $-210$ na $-210 - 2^{-23}$ powoduje przejście
|
||||
pierwiastków od 10 do 19 z $\mathbb{R}$ do $\mathbb{C}$. Wszystkie
|
||||
pierwiastki w zmodyfikowanym wielomianie odbiegają o wiele mocniej
|
||||
od ich rzeczywistych wartości, szczególnie te, które są zespolone.
|
||||
Na nich widać również, że nie są rozmieszczone równomiernie, tak
|
||||
jak dla oryginalnego wielomianu. Tak jak w poprzednich zadaniach,
|
||||
to jest źle uwarunkowane.
|
||||
|
||||
\vspace{0.5cm}
|
||||
|
||||
\textbf{Zad. 5}
|
||||
|
||||
Rozważamy równanie rekurencyjne
|
||||
$p_{n + 1} := p_n + rp_n(1 - p_n)$ dla $n = 0, 1, ...$.
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
Dla $p_0 = 0.01$ i $r = 3$ przeprowadzamy następujące eksperymenty:
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
1. Dla arytmetyki $Float32$ wykonujemy 40 iteracji
|
||||
równania, następnie wykonujemy 10 iteracji,
|
||||
obcinamy liczbę w tej iteracji do 3 miejsca po
|
||||
przecinku po czym wykonujemy kolejne 30 iteracji.
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
2. Tak jak wyżej wykonujemy 40 iteracji, porównujemy
|
||||
wyniki dla arytmetyki $Float32$ i $Float64$.
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
Eksperyment 1:
|
||||
|
||||
\begin{longtable}{|c|c|c|}
|
||||
\hline
|
||||
$n$ & 40 iteracji & trunc \\ \hline
|
||||
0 & 0.01 & 0.01 \\
|
||||
1 & 0.0397 & 0.0397 \\
|
||||
2 & 0.15407173 & 0.15407173 \\
|
||||
3 & 0.5450726 & 0.5450726 \\
|
||||
4 & 1.2889781 & 1.2889781 \\
|
||||
5 & 0.1715188 & 0.1715188 \\
|
||||
6 & 0.5978191 & 0.5978191 \\
|
||||
7 & 1.3191134 & 1.3191134 \\
|
||||
8 & 0.056273222 & 0.056273222 \\
|
||||
9 & 0.21559286 & 0.21559286 \\
|
||||
10 & 0.7229306 & 0.7229306 \\
|
||||
11 & 1.3238364 & 1.3241479 \\
|
||||
12 & 0.037716985 & 0.036488414 \\
|
||||
13 & 0.14660022 & 0.14195944 \\
|
||||
14 & 0.521926 & 0.50738037 \\
|
||||
15 & 1.2704837 & 1.2572169 \\
|
||||
16 & 0.2395482 & 0.28708452 \\
|
||||
17 & 0.7860428 & 0.9010855 \\
|
||||
18 & 1.2905813 & 1.1684768 \\
|
||||
19 & 0.16552472 & 0.577893 \\
|
||||
20 & 0.5799036 & 1.3096911 \\
|
||||
21 & 1.3107498 & 0.09289217 \\
|
||||
22 & 0.088804245 & 0.34568182 \\
|
||||
23 & 0.3315584 & 1.0242395 \\
|
||||
24 & 0.9964407 & 0.94975823 \\
|
||||
25 & 1.0070806 & 1.0929108 \\
|
||||
26 & 0.9856885 & 0.7882812 \\
|
||||
27 & 1.0280086 & 1.2889631 \\
|
||||
28 & 0.9416294 & 0.17157483 \\
|
||||
29 & 1.1065198 & 0.59798557 \\
|
||||
30 & 0.7529209 & 1.3191822 \\
|
||||
31 & 1.3110139 & 0.05600393 \\
|
||||
32 & 0.0877831 & 0.21460639 \\
|
||||
33 & 0.3280148 & 0.7202578 \\
|
||||
34 & 0.9892781 & 1.3247173 \\
|
||||
35 & 1.021099 & 0.034241438 \\
|
||||
36 & 0.95646656 & 0.13344833 \\
|
||||
37 & 1.0813814 & 0.48036796 \\
|
||||
38 & 0.81736827 & 1.2292118 \\
|
||||
39 & 1.2652004 & 0.3839622 \\
|
||||
40 & 0.25860548 & 1.093568 \\
|
||||
\hline
|
||||
\end{longtable}
|
||||
|
||||
Eksperyment 2:
|
||||
|
||||
\begin{longtable}{|c|c|c|}
|
||||
\hline
|
||||
$n$ & $Float32$ & $Float64$ \\ \hline
|
||||
0 & 0.01 & 0.01 \\
|
||||
1 & 0.0397 & 0.0397 \\
|
||||
2 & 0.15407173 & 0.15407173000000002 \\
|
||||
3 & 0.5450726 & 0.5450726260444213 \\
|
||||
4 & 1.2889781 & 1.2889780011888006 \\
|
||||
5 & 0.1715188 & 0.17151914210917552 \\
|
||||
6 & 0.5978191 & 0.5978201201070994 \\
|
||||
7 & 1.3191134 & 1.3191137924137974 \\
|
||||
8 & 0.056273222 & 0.056271577646256565 \\
|
||||
9 & 0.21559286 & 0.21558683923263022 \\
|
||||
10 & 0.7229306 & 0.722914301179573 \\
|
||||
11 & 1.3238364 & 1.3238419441684408 \\
|
||||
12 & 0.037716985 & 0.03769529725473175 \\
|
||||
13 & 0.14660022 & 0.14651838271355924 \\
|
||||
14 & 0.521926 & 0.521670621435246 \\
|
||||
15 & 1.2704837 & 1.2702617739350768 \\
|
||||
16 & 0.2395482 & 0.24035217277824272 \\
|
||||
17 & 0.7860428 & 0.7881011902353041 \\
|
||||
18 & 1.2905813 & 1.2890943027903075 \\
|
||||
19 & 0.16552472 & 0.17108484670194324 \\
|
||||
20 & 0.5799036 & 0.5965293124946907 \\
|
||||
21 & 1.3107498 & 1.3185755879825978 \\
|
||||
22 & 0.088804245 & 0.058377608259430724 \\
|
||||
23 & 0.3315584 & 0.22328659759944824 \\
|
||||
24 & 0.9964407 & 0.7435756763951792 \\
|
||||
25 & 1.0070806 & 1.315588346001072 \\
|
||||
26 & 0.9856885 & 0.07003529560277899 \\
|
||||
27 & 1.0280086 & 0.26542635452061003 \\
|
||||
28 & 0.9416294 & 0.8503519690601384 \\
|
||||
29 & 1.1065198 & 1.2321124623871897 \\
|
||||
30 & 0.7529209 & 0.37414648963928676 \\
|
||||
31 & 1.3110139 & 1.0766291714289444 \\
|
||||
32 & 0.0877831 & 0.8291255674004515 \\
|
||||
33 & 0.3280148 & 1.2541546500504441 \\
|
||||
34 & 0.9892781 & 0.29790694147232066 \\
|
||||
35 & 1.021099 & 0.9253821285571046 \\
|
||||
36 & 0.95646656 & 1.1325322626697856 \\
|
||||
37 & 1.0813814 & 0.6822410727153098 \\
|
||||
38 & 0.81736827 & 1.3326056469620293 \\
|
||||
39 & 1.2652004 & 0.0029091569028512065 \\
|
||||
40 & 0.25860548 & 0.011611238029748606 \\
|
||||
\hline
|
||||
\end{longtable}
|
||||
|
||||
W pierwszym eksperymencie ostateczna wartość po obcięciu
|
||||
wyniku po 10 iteracji jest około 4 razy większa od
|
||||
wartości otrzymanej po wykonaniu 40 iteracji bez zmian.
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
W drugim eksperymencie wykorzystanie arytmetyki $Float64$
|
||||
po 40 iteracjach dało nam wartość około 25 razy
|
||||
mniejszą od tej uzyskanej w arytmetyce $Float32$.
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
Oba eksperymenty wskazują na złe uwarunkowanie
|
||||
zadania, wyniki są bardzo czułe na utratę precyzji.
|
||||
|
||||
\vspace{0.5cm}
|
||||
|
||||
\textbf{Zad. 6}
|
||||
|
||||
Rozważamy równanie rekurencyjne
|
||||
$x_{n + 1} := x_n^2 + c$ dla $n = 0, 1, ...$,
|
||||
gdzie $c$ jest stałą.
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
Wykonujemy 40 iteracji równania dla następujących danych:
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
1. $c = -2$ i $x_0 = 1$
|
||||
|
||||
\includegraphics[scale=0.3]{6.1}
|
||||
|
||||
2. $c = -2$ i $x_0 = 2$
|
||||
|
||||
\includegraphics[scale=0.3]{6.2}
|
||||
|
||||
3. $c = -2$ i $x_0 = 1.99999999999999$
|
||||
|
||||
\includegraphics[scale=0.3]{6.3}
|
||||
|
||||
4. $c = -1$ i $x_0 = 1$
|
||||
|
||||
\includegraphics[scale=0.3]{6.4}
|
||||
|
||||
5. $c = -1$ i $x_0 = -1$
|
||||
|
||||
\includegraphics[scale=0.3]{6.5}
|
||||
|
||||
6. $c = -1$ i $x_0 = 0.75$
|
||||
|
||||
\includegraphics[scale=0.3]{6.6}
|
||||
|
||||
7. $c = -1$ i $x_0 = 0.25$
|
||||
|
||||
\includegraphics[scale=0.3]{6.7}
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
Wykresy 1. i 2. są stałe, na 3. wykresie początkowo otrzymujemy
|
||||
2, ale koło wartości 21 zaczynają się pojawiać dość duże błędy.
|
||||
Wartość kilkukrotnie zbliża się, lecz nigdy nie osiąga 2.
|
||||
Przez $x_0$ bardzo bliski 2, lecz nie równy błąd staje się
|
||||
coraz większy aż w końcu powoduje spadek wartości. Gdy $x_0$ jest
|
||||
liczbą całkowitą wyniki są zgodne z oczekiwaniami.
|
||||
|
||||
\vspace{0.25cm}
|
||||
|
||||
Na wykresach 4. i 5. wyniki oscylują wokół oczekiwanych wartości.
|
||||
Wykresy 6. i 7. po krótkim czasie zaczynają na zmianę przyjmować wartości -1 i 0.
|
||||
|
||||
\vspace{0.5cm}
|
||||
|
||||
\textbf{Wnioski z listy}
|
||||
|
||||
Zadania były źle uwarunkowane, czyli bardzo czułe na
|
||||
utratę precyzji z powodu nieuwzględnienia rzędu wielkości
|
||||
wyników. Przy pracy z liczbami zmiennoprzecinkowymi należy
|
||||
pamiętać, aby dobrać odpowiedni typ do rozmiaru danych, z którymi
|
||||
pracujemy oraz o błędach wynikających z operacji na tych liczbach.
|
||||
|
||||
\end{document}
|
Loading…
Reference in a new issue