Biostat/Biomath M257 Homework 1
Due Apr 14 @ 11:59PM
1 Q1
No handwritten homework reports are accepted for this course. We work with Git/GitHub. Efficient and abundant use of Git, e.g., frequent and well-documented commits, is an important criterion for grading your homework.
If you don’t have a GitHub account, apply for the Student Developer Pack at GitHub using your UCLA email.
Create a private repository
biostat-257-2023-spring
and addHua-Zhou
andparsajamshidian
(TA) as your collaborators.Top directories of the repository should be
hw1
,hw2
, … You may create other branches for developing your homework solutions; but themaster
branch will be your presentation area. Put your homework submission files (Jupyter notebook.ipynb
, html converted from notebook, all code and data set to reproduce results) in themaster
branch.After each homework due date, teaching assistant and instructor will check out your
master
branch for grading. Tag each of your homework submissions with tag nameshw1
,hw2
, … Tagging time will be used as your submission time. That means if you tag your hw1 submission after deadline, penalty points will be deducted for late submission.Read the style guide for Julia programming. Following rules in the style guide will be strictly enforced when grading: (1) four space indenting rule, (2) 92 charcter rule, (3) space after comma rule, (4) no space before comma rule, (5) space around binary operator rule.
2 Q2
Let’s check whether floating-point numbers obey certain algebraic rules. For 2-5, one counter-example suffices.
Associative rule for addition says
(x + y) + z == x + (y + z)
. Check association rule usingx = 0.1
,y = 0.1
andz = 1.0
in Julia. Explain what you find.Do floating-point numbers obey the associative rule for multiplication:
(x * y) * z == x * (y * z)
?Do floating-point numbers obey the distributive rule:
a * (x + y) == a * x + a * y
?Is
0 * x == 0
true for all floating-point numberx
?Is
x / a == x * (1 / a)
always true?
3 Q3
Consider Julia function
function g(k)
for i in 1:10
= 5k - 1
k end
kend
- Use
@code_llvm
to find the LLVM bitcode of compiledg
withInt64
input.
- Use
@code_llvm
to find the LLVM bitcode of compiledg
withFloat64
input.
- Compare the bitcode from questions 1 and 2. What do you find?
- Read Julia documentation on
@fastmath
and repeat the questions 1-3 on the function
function g_fastmath(k)
@fastmath for i in 1:10
= 5k - 1
k end
kend
Explain what does the macro @fastmath
do? And why are the bitcodes for g
and g_fastmath
with Float64
input different? (Hint: Q2)
4 Q4
Create the vector x = (0.988, 0.989, 0.990, ..., 1.010, 1.011, 1.012)
.
Plot the polynomial
y = x^7 - 7x^6 + 21x^5 - 35x^4 + 35x^3 - 21x^2 + 7x - 1
at pointsx
.Plot the polynomial
y = (x - 1)^7
at pointsx
.Explain what you found.
5 Q5
Show the Sherman-Morrison formula \[ (\mathbf{A} + \mathbf{u} \mathbf{u}^T)^{-1} = \mathbf{A}^{-1} - \frac{1}{1 + \mathbf{u}^T \mathbf{A}^{-1} \mathbf{u}} \mathbf{A}^{-1} \mathbf{u} \mathbf{u}^T \mathbf{A}^{-1}, \] where \(\mathbf{A} \in \mathbb{R}^{n \times n}\) is nonsingular and \(\mathbf{u} \in \mathbb{R}^n\). This formula supplies the inverse of the symmetric, rank-one perturbation of \(\mathbf{A}\).
Show the Woodbury formula \[ (\mathbf{A} + \mathbf{U} \mathbf{V}^T)^{-1} = \mathbf{A}^{-1} - \mathbf{A}^{-1} \mathbf{U} (\mathbf{I}_m + \mathbf{V}^T \mathbf{A}^{-1} \mathbf{U})^{-1} \mathbf{V}^T \mathbf{A}^{-1}, \] where \(\mathbf{A} \in \mathbb{R}^{n \times n}\) is nonsingular, \(\mathbf{U}, \mathbf{V} \in \mathbb{R}^{n \times m}\), and \(\mathbf{I}_m\) is the \(m \times m\) identity matrix. In many applications \(m\) is much smaller than \(n\). Woodbury formula generalizes Sherman-Morrison and is valuable because the smaller matrix \(\mathbf{I}_m + \mathbf{V}^T \mathbf{A}^{-1} \mathbf{U}\) is cheaper to invert than the larger matrix \(\mathbf{A} + \mathbf{U} \mathbf{V}^T\).
Show the binomial inversion formula \[ (\mathbf{A} + \mathbf{U} \mathbf{B} \mathbf{V}^T)^{-1} = \mathbf{A}^{-1} - \mathbf{A}^{-1} \mathbf{U} (\mathbf{B}^{-1} + \mathbf{V}^T \mathbf{A}^{-1} \mathbf{U})^{-1} \mathbf{V}^T \mathbf{A}^{-1}, \] where \(\mathbf{A}\) and \(\mathbf{B}\) are nonsingular.
Show the identity \[ \text{det}(\mathbf{A} + \mathbf{U} \mathbf{V}^T) = \text{det}(\mathbf{A}) \text{det}(\mathbf{I}_m + \mathbf{V}^T \mathbf{A}^{-1} \mathbf{U}). \] This formula is useful for evaluating the density of a multivariate normal with covariance matrix \(\mathbf{A} + \mathbf{U} \mathbf{V}^T\).
Hint: 1 and 2 are special cases of 3. For 4, show that \[ \begin{pmatrix} - \mathbf{A} & \mathbf{O} \\ \mathbf{O} & \mathbf{I} + \mathbf{V}^T \mathbf{A}^{-1} \mathbf{U} \end{pmatrix} = \begin{pmatrix} \mathbf{I} & \mathbf{O} \\ \mathbf{V}^T \mathbf{A}^{-1} & \mathbf{I} \end{pmatrix} \begin{pmatrix} - \mathbf{A} & \mathbf{U} \\ \mathbf{V}^T & \mathbf{I} \end{pmatrix} \begin{pmatrix} \mathbf{I} & \mathbf{A}^{-1} \mathbf{U} \\ \mathbf{O} & \mathbf{I} \end{pmatrix}. \]
6 Q6
Demonstrate the following facts about triangular and orthogonal matrices in Julia (one numerical example for each fact). Mathematically curious ones are also encouraged to prove them.
Note a unit triangular matrix is a triangular matrix with all diagonal entries being 1.
The product of two upper (lower) triangular matrices is upper (lower) triangular.
The inverse of an upper (lower) triangular matrix is upper (lower) triangular.
The product of two unit upper (lower) triangular matrices is unit upper (lower) triangular.
The inverse of a unit upper (lower) triangular matrix is unit upper (lower) triangular.
An orthogonal upper (lower) triangular matrix is diagonal. (You just need to prove this.)
The product of two orthogonal matrices is orthogonal.
7 Q7
Let the \(n \times n\) matrix H
have elements H[i, j] = 1 / (i + j - 1)
.
Write a function
h(n)
that outputs \(n \times n\) matrixH
. Try at least 4 ways, e.g., \(ij\)-looping, \(ji\)-looping, comprehension, and vectorization (R style). Compute and printH
forn = 5
.Compare their efficiencies (using
BenchmarkTools
) atn = 5000
.