program讲解 、辅导 c++,Python编程语言
Lab Report #1 - Root finding part 1
Math 9
Due 2/5 (see Canvas for details)
Instructions: Submit your report as a Matlab live script (i.e. a .mlx
file). Plots should be produced and displayed within the .mlx file. Note:
there are no regrades for this assignment. The assignment is out of 10
points.
Introduction: One of the key uses of root-finding is to solve equations
that we can’t solve analytically (i.e. by doing algebra, etc.). Note that any
equation with one unknown can be transformed into a root-finding problem
by subtracting the right-hand side from the left-hand side to get something
like
LHS − RHS = 0
Here we will look at a well-known example of an equation that can’t be
solved analytically which arises in quantum mechanics: the finite square well
(if you’re curious, click here (Wikipedia). Don’t worry - no knowledge of
quantum mechanics is required or expected! If you’re interested, here is a
simple summary of the physical meaning behind the problem we’ll study.
A particle inside a well is like a ball bouncing around inside a box
with an open top. The ball’s bounces could be small or large, but
if it bounces too high it will escape from the box. We will let v
represent the energy of the particle (like the height of the bounces)
and u0 the energy required to escape the well (like the depth of the
box). As long as v < u0, the particle will be trapped in the well.
The key point of quantum physics is that unlike the bouncing
ball, there will be only a finite number of possible ”energy levels”
- amounts of energy the particle can have. Here, we’ll use our
Matlab knowledge to study this and make a nice diagram of the
energy levels.
1
Tasks
1. (3 points) Energy levels can be divided into even and odd (referring to
whether they’re associated with a state having even or odd symmetry).
For a given u0 describing the depth of the well, even energy levels are
given by the values of v ∈ (0, u0) that are roots of the equation
f(v) = cos v
q
u
2
0 − v
2 − v sin v = 0 (1)
Using u0 = 20, produce the plot of f(v) shown below (on the next page)
via the following steps:
(a) Create an array 100 evenly-spaced values of v from 0 to u0.
(b) Compute an array of the values of f(v) for each value in your v
array by implementing Equation 1 (above) in Matlab. Remember
to use element-wise operators (with the dot)!
(c) To make the line easier to see, we will increase the width. Fill
in the blanks: plot( , , ’LineWidth’, 2) to plot v on the
horizontal axis and f(v) on the vertical axis.
(d) Immediately after your plot command, set the axis labels and title
as shown, using the commands xlabel, ylabel, and title. Note:
u0 can by typed like "u 0".
(e) Use the command fontsize( , "points") to set the font size
large enough to be read. (Try something around 14).
2. (1 points) Repeat the above process to produce a similar plot for u0 =
100. You should expect to see that it looks very jagged.
3. (1 point) Think about what part of our code we could change in order
to make the line smoother. By making an appropriate change, create
a new plot for u0 = 100 that looks smooth like the example from Task
1.
4. (1 point) Using your bisect function, compute and display the only root
of f(v) for u0 = 1, with an error under 10−6
. Hint: You need to figure
out what to use as your initial xl and xr. Try making a plot and looking
at it to choose a starting interval that contains the root!
2
Figure 1: For Task 1.
5. (4 points) Following the following steps, produce an array (you can call
it root array) containing all roots for u0 = 20.
(a) Create an array 100 evenly-spaced values of v from 0 to u0.
(b) Compute an array of the values of f(v) for each value in your v
array (just like above).
(c) Next, we want to find pairs of successive v values in our v array such that the sign of f(v) changes between them, to serve
as our xl and xr in the bisection method. Create xl array and
xr array such that the i-th root lies between xl array(i) and
xr array(i). At the bottom of this file there’s a snippet that
shows you how to do this - you can copy it for no loss of points.
However, If you want to practice thinking like a Matlab programmer, try coming up with a way to do this via logical indexing
yourself. You should find 7 of them!
(d) Pre-allocate a 7-element vector called root array filled with zeros.
(e) Using a for loop, loop over a variable i from 1 to 7, and at each
step call the bisect function using your left and right endpoints
from xl array and xr array. To input the function (first input
3
to bisect), use an anonymous function. Recall the syntax: If we
wanted to express just f(v) = p
u
2
0 − v
2
, it would be
@(v) sqrt(u_0.^2 - v.^2)
so you just have to change the part after the @(v) to the correct
f(v) from above.
(f) Display the resulting value of root array. You should get values
of approximately:
1.4959 4.4862 7.4711 10.4460 13.4028
16.3240 19.1433
4
Help for 5c: Assuming your v and f arrays are called v array and f array,
try using the following code:
inds = find(sign(f_array(1:(end-1))) ~= sign(f_array(2:end)));
xl_array = v_array(inds);
xr_array = v_array(inds+1);
5