Skip to content

Update base repo #6

Merged
merged 15 commits into from
Feb 15, 2017
73 changes: 73 additions & 0 deletions HW3/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# Homework #3
## due 2/15/17 by 11:59pm


1. Create a new github repository called 'roots_and_optimization'.

a. Add rcc02007 and pez16103 as collaborators.

b. Clone the repository to your computer.

c. Copy your `projectile.m` function into the 'roots_and_optimization' folder.
*Disable the plotting routine for the solvers*

d. Use the four solvers `falsepos.m`, `bisect.m`, `newtraph.m` and `mod_secant.m`
to solve for the angle needed to reach h=1.72 m, with an initial speed of 15 m/s.

e. The `newtraph.m` function needs a derivative, calculate the derivative of your
function with respect to theta, `dprojectile_dtheta.m`. This function should
output d(h)/d(theta).


f. In your `README.md` file, document the following under the heading `#
Homework #3`:

i. Compare the number of iterations that each function needed to reach an
accuracy of 0.00001%. Include a table in your README.md with:

```
| solver | initial guess(es) | ea | number of iterations|
| --- | --- | --- | --- |
|falsepos | | | |
|bisect | | | |
|newtraph | | | |
|mod_secant | | | |
```

ii. Compare the convergence of the 4 methods. Plot the approximate error vs the
number of iterations that the solver has calculated. Save the plot as
`convergence.png` and display the plot in your `README.md` with:

`![Plot of convergence for four numerical solvers.](convergence.png)`

iii. In the `README.md` provide a description of the files used to create the
table and the convergence plot.

2. The Newton-Raphson method and the modified secant method do not always converge to a
solution. One simple example is the function f(x) = x*exp(-x^2). The root is at 0, but
using the numerical solvers, `newtraph.m` and `mod_secant.m`, there are certain initial
guesses that do not converge.

a. Calculate the first 5 iterations for the Newton-Raphson method with an initial
guess of x_i=2 for f(x)=x*exp(-x^2).

b. Add the results to a table in the `README.md` with:

```
### divergence of Newton-Raphson method

| iteration | x_i | approx error |
| --- | --- | --- |
| 0 | 2 | n/a |
| 1 | | |
| 2 | | |
| 3 | | |
| 4 | | |
| 5 | | |
```

c. Repeat steps a-b for an initial guess of 0.2. (But change the heading from
'divergence' to 'convergence')

3. Commit your changes to your repository. Sync your local repository with github. Then
copy and paste the "clone URL" into the following Google Form [Homework 3](https://goo.gl/forms/UJBGwp0fQcSxImkq2)
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,8 @@ general, I will not post homework solutions.
|3|1/31||Consistent Coding habits|
| |2/2|5|Root Finding|
|4|2/7|6|Root Finding con’d|
| |2/9|7|Optimization|
|5|2/14||Intro to Linear Algebra|
| |2/9|7| **Snow Day**|
|5|2/14|| Optimization |
| |2/16|8|Linear Algebra|
|6|2/21|9|Linear systems: Gauss elimination|
| |2/23|10|Linear Systems: LU factorization|
Expand Down
37 changes: 37 additions & 0 deletions lecture_06/bisect.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
function [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,varargin)
% bisect: root location zeroes
% [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,p1,p2,...):
% uses bisection method to find the root of func
% input:
% func = name of function
% xl, xu = lower and upper guesses
% es = desired relative error (default = 0.0001%)
% maxit = maximum allowable iterations (default = 50)
% p1,p2,... = additional parameters used by func
% output:
% root = real root
% fx = function value at root
% ea = approximate relative error (%)
% iter = number of iterations
if nargin<3,error('at least 3 input arguments required'),end
test = func(xl,varargin{:})*func(xu,varargin{:});
if test>0,error('no sign change'),end
if nargin<4|isempty(es), es=0.0001;end
if nargin<5|isempty(maxit), maxit=50;end
iter = 0; xr = xl; ea = 100;
while (1)
xrold = xr;
xr = (xl + xu)/2;
iter = iter + 1;
if xr ~= 0,ea = abs((xr - xrold)/xr) * 100;end
test = func(xl,varargin{:})*func(xr,varargin{:});
if test < 0
xu = xr;
elseif test > 0
xl = xr;
else
ea = 0;
end
if ea <= es | iter >= maxit,break,end
end
root = xr; fx = func(xr, varargin{:});
39 changes: 39 additions & 0 deletions lecture_06/falsepos.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
function [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,varargin)
% bisect: root location zeroes
% [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,p1,p2,...):
% uses bisection method to find the root of func
% input:
% func = name of function
% xl, xu = lower and upper guesses
% es = desired relative error (default = 0.0001%)
% maxit = maximum allowable iterations (default = 50)
% p1,p2,... = additional parameters used by func
% output:
% root = real root
% fx = function value at root
% ea = approximate relative error (%)
% iter = number of iterations
if nargin<3,error('at least 3 input arguments required'),end
test = func(xl,varargin{:})*func(xu,varargin{:});
if test>0,error('no sign change'),end
if nargin<4|isempty(es), es=0.0001;end
if nargin<5|isempty(maxit), maxit=50;end
iter = 0; xr = xl; ea = 100;
while (1)
xrold = xr;
xr = (xl + xu)/2;
% xr = (xl + xu)/2; % bisect method
xr=xu - (f_m(xu)*(xl-xu))/(f_m(xl)-f_m(xu)); % false position method
iter = iter + 1;
if xr ~= 0,ea = abs((xr - xrold)/xr) * 100;end
test = func(xl,varargin{:})*func(xr,varargin{:});
if test < 0
xu = xr;
elseif test > 0
xl = xr;
else
ea = 0;
end
if ea <= es | iter >= maxit,break,end
end
root = xr; fx = func(xr, varargin{:});
37 changes: 37 additions & 0 deletions lecture_06/incsearch.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
function xb = incsearch(func,xmin,xmax,ns)
% incsearch: incremental search root locator
% xb = incsearch(func,xmin,xmax,ns):
% finds brackets of x that contain sign changes
% of a function on an interval
% input:
% func = name of function
% xmin, xmax = endpoints of interval
% ns = number of subintervals (default = 50)
% output:
% xb(k,1) is the lower bound of the kth sign change
% xb(k,2) is the upper bound of the kth sign change
% If no brackets found, xb = [].
if nargin < 3, error('at least 3 arguments required'), end
if nargin < 4, ns = 50; end %if ns blank set to 50
% Incremental search
x = linspace(xmin,xmax,ns);
f = func(x);
nb = 0; xb = []; %xb is null unless sign change detected
%for k = 1:length(x)-1
% if sign(f(k)) ~= sign(f(k+1)) %check for sign change
% nb = nb + 1;
% xb(nb,1) = x(k);
% xb(nb,2) = x(k+1);
% end
%end
sign_change = diff(sign(f));
[~,i_change] = find(sign_change~=0);
nb=length(i_change);
xb=[x(i_change)',x(i_change+1)'];

if isempty(xb) %display that no brackets were found
fprintf('no brackets found\n')
fprintf('check interval or increase ns\n')
else
fprintf('number of brackets: %i\n',nb) %display number of brackets
end