add hw 7 and documentation for q1 and part of q2 in lizfcm api reference
This commit is contained in:
parent
c02573cb66
commit
4d2d4f5d7a
@ -1,4 +1,4 @@
|
|||||||
#+TITLE: LIZFCM Software Manual (v0.3)
|
#+TITLE: LIZFCM Software Manual (v0.4)
|
||||||
#+AUTHOR: Elizabeth Hunt
|
#+AUTHOR: Elizabeth Hunt
|
||||||
#+LATEX_HEADER: \notindent \notag \usepackage{amsmath} \usepackage[a4paper,margin=1in,portrait]{geometry}
|
#+LATEX_HEADER: \notindent \notag \usepackage{amsmath} \usepackage[a4paper,margin=1in,portrait]{geometry}
|
||||||
#+LATEX: \setlength\parindent{0pt}
|
#+LATEX: \setlength\parindent{0pt}
|
||||||
@ -286,7 +286,6 @@ double sum_v(Array_double *v) {
|
|||||||
}
|
}
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
|
|
||||||
*** ~scale_v~
|
*** ~scale_v~
|
||||||
+ Author: Elizabeth Hunt
|
+ Author: Elizabeth Hunt
|
||||||
+ Name: ~scale_v~
|
+ Name: ~scale_v~
|
||||||
@ -993,6 +992,71 @@ Line *least_squares_lin_reg(Array_double *x, Array_double *y) {
|
|||||||
return line;
|
return line;
|
||||||
}
|
}
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
|
** Eigen-Adjacent
|
||||||
|
*** ~dominant_eigenvalue~
|
||||||
|
+ Author: Elizabeth Hunt
|
||||||
|
+ Name: ~dominant_eigenvalue~
|
||||||
|
+ Location: ~src/eigen.c~
|
||||||
|
+ Input: a pointer to an invertible matrix ~m~, an initial eigenvector guess ~v~ (that is non
|
||||||
|
zero or orthogonal to an eigenvector with the dominant eigenvalue), a ~tolerance~ and
|
||||||
|
~max_iterations~ that act as stop conditions
|
||||||
|
+ Output: the dominant eigenvalue with the highest magnitude, approximated with the Power
|
||||||
|
Iteration Method
|
||||||
|
|
||||||
|
#+BEGIN_SRC c
|
||||||
|
double dominant_eigenvalue(Matrix_double *m, Array_double *v, double tolerance,
|
||||||
|
size_t max_iterations) {
|
||||||
|
assert(m->rows == m->cols);
|
||||||
|
assert(m->rows == v->size);
|
||||||
|
|
||||||
|
double error = tolerance;
|
||||||
|
size_t iter = max_iterations;
|
||||||
|
double lambda = 0.0;
|
||||||
|
Array_double *eigenvector_1 = copy_vector(v);
|
||||||
|
|
||||||
|
while (error >= tolerance && (--iter) > 0) {
|
||||||
|
Array_double *eigenvector_2 = m_dot_v(m, eigenvector_1);
|
||||||
|
|
||||||
|
Array_double *mx = m_dot_v(m, eigenvector_2);
|
||||||
|
double new_lambda =
|
||||||
|
v_dot_v(mx, eigenvector_2) / v_dot_v(eigenvector_2, eigenvector_2);
|
||||||
|
|
||||||
|
error = fabs(new_lambda - lambda);
|
||||||
|
lambda = new_lambda;
|
||||||
|
free_vector(eigenvector_1);
|
||||||
|
eigenvector_1 = eigenvector_2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return lambda;
|
||||||
|
}
|
||||||
|
#+END_SRC
|
||||||
|
*** ~leslie_matrix~
|
||||||
|
+ Author: Elizabeth Hunt
|
||||||
|
+ Name: ~leslie_matrix~
|
||||||
|
+ Location: ~src/eigen.c~
|
||||||
|
+ Input: two pointers to ~Array_double~'s representing the ratio of individuals in an age class
|
||||||
|
$x$ getting to the next age class $x+1$ and the number of offspring that individuals in an age
|
||||||
|
class create in age class 0.
|
||||||
|
+ Output: the leslie matrix generated with the input vectors.
|
||||||
|
|
||||||
|
#+BEGIN_SRC c
|
||||||
|
Matrix_double *leslie_matrix(Array_double *age_class_surivor_ratio,
|
||||||
|
Array_double *age_class_offspring) {
|
||||||
|
assert(age_class_surivor_ratio->size + 1 == age_class_offspring->size);
|
||||||
|
|
||||||
|
Matrix_double *leslie = InitMatrixWithSize(double, age_class_offspring->size,
|
||||||
|
age_class_offspring->size, 0.0);
|
||||||
|
|
||||||
|
free_vector(leslie->data[0]);
|
||||||
|
leslie->data[0] = age_class_offspring;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < age_class_surivor_ratio->size; i++)
|
||||||
|
leslie->data[i + 1]->data[i] = age_class_surivor_ratio->data[i];
|
||||||
|
return leslie;
|
||||||
|
}
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
** Appendix / Miscellaneous
|
** Appendix / Miscellaneous
|
||||||
*** Data Types
|
*** Data Types
|
||||||
**** ~Line~
|
**** ~Line~
|
||||||
|
10
homeworks/hw-7.org
Normal file
10
homeworks/hw-7.org
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#+TITLE: Homework 6
|
||||||
|
#+AUTHOR: Elizabeth Hunt
|
||||||
|
#+LATEX_HEADER: \notindent \notag \usepackage{amsmath} \usepackage[a4paper,margin=1in,portrait]{geometry}
|
||||||
|
#+LATEX: \setlength\parindent{0pt}
|
||||||
|
#+OPTIONS: toc:nil
|
||||||
|
|
||||||
|
* Question One
|
||||||
|
See ~UTEST(eigen, dominant_eigenvalue)~ in ~test/eigen.t.c~ and the entry
|
||||||
|
~Eigen-Adjacent -> dominant_eigenvalue~ in the LIZFCM API documentation.
|
||||||
|
* Question Two
|
@ -14,10 +14,8 @@ Matrix_double *leslie_matrix(Array_double *age_class_surivor_ratio,
|
|||||||
free_vector(leslie->data[0]);
|
free_vector(leslie->data[0]);
|
||||||
leslie->data[0] = age_class_offspring;
|
leslie->data[0] = age_class_offspring;
|
||||||
|
|
||||||
for (size_t i = 0; i < age_class_surivor_ratio->size; i++) {
|
for (size_t i = 0; i < age_class_surivor_ratio->size; i++)
|
||||||
leslie->data[i + 1]->data[i] = age_class_surivor_ratio->data[i];
|
leslie->data[i + 1]->data[i] = age_class_surivor_ratio->data[i];
|
||||||
}
|
|
||||||
|
|
||||||
return leslie;
|
return leslie;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -37,9 +35,9 @@ double dominant_eigenvalue(Matrix_double *m, Array_double *v, double tolerance,
|
|||||||
Array_double *mx = m_dot_v(m, eigenvector_2);
|
Array_double *mx = m_dot_v(m, eigenvector_2);
|
||||||
double new_lambda =
|
double new_lambda =
|
||||||
v_dot_v(mx, eigenvector_2) / v_dot_v(eigenvector_2, eigenvector_2);
|
v_dot_v(mx, eigenvector_2) / v_dot_v(eigenvector_2, eigenvector_2);
|
||||||
|
|
||||||
error = fabs(new_lambda - lambda);
|
error = fabs(new_lambda - lambda);
|
||||||
lambda = new_lambda;
|
lambda = new_lambda;
|
||||||
|
|
||||||
free_vector(eigenvector_1);
|
free_vector(eigenvector_1);
|
||||||
eigenvector_1 = eigenvector_2;
|
eigenvector_1 = eigenvector_2;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user