Scot Gould

Scot Gould

747 Reputation

14 Badges

11 years, 173 days
Claremont McKenna, Pitzer, Scripps College
Professor of Physics
Upland, California, United States
Dr. Scot Gould is a professor of physics in the W.M. Keck Science Department of Claremont McKenna, Pitzer, and Scripps Colleges - members of The Claremont Colleges in California. He was involved in the early development of the atomic force microscope. His research has included numerous studies and experiments using scanning probe microscopes, particularly those involving natural fibers such as spider silk. More recently, he was involved in developing and sustaining AISS. This full-year multi-unit, non-traditional, interdisciplinary undergraduate science education course integrated topics from biology, chemistry, physics, mathematics, and computer science. His current interest is integrating computational topics into the physics curriculum. He teaches the use of Maple's computer algebraic and numerical systems to assist students in modeling and visualizing physical and biological systems. His Dirac-notation-based quantum mechanics course is taught solely through Maple.

MaplePrimes Activity


These are answers submitted by Scot Gould

Carl Love is spot on with his response. And I appreciate the fact he listed a help page for more reference.

 

I'm adding my comments because I sense you are a new user.  Even as an experienced user of Maple, I found learning about DataFrames as, well, not always intuitive. However, now I find DataFrames are wonderful. They are far more useful and powerful than trying to work with spreadsheets. (Alternatively, you can work with R, yet another programming language.)

 

The reason I suspect you are a new user is because you are using 2d Input with the Document mode, Hence I have some suggestions, which you are welcome to ignore.

 

* Until you become an expert, I encourage you to switch to "Worksheet" mode. Go to "Tools" -> "Option", select "Interface" tab and choose "Worksheet" option under "Default format for new worksheets".  

 

"Document" mode is great for writing... documents. They were was heavily used at the recent Maple Conference of 2021:

        https://www.maplesoft.com/mapleconference/2021/agenda.aspx  

And, in the new journal "Maple Transactions":  https://mapletransactions.org/index.php/maple.   

 

But for general use, most new users I work with usually find worksheet mode useful in organizing their ...work.

 

* Maplesoft has a useful guide to DataFrames. See:

      https://www.maplesoft.com/support/help/Maple/view.aspx?path=DataFrame%2fGuide

 

* Two possibly useful examples of working with DataFrames can be found at these postings:

  - https://www.mapleprimes.com/posts/209845-Dataframes--Looking-For-A-New-Flashlight

  - https://www.mapleprimes.com/posts/213367-Timely-DataFrames-Example-2020-US-Presidential

 

 With regards to your problem,

1) may I suggest you reduce some of your work by "Import"ing directly from the CSV file from the website (rather than downloading it first to a separate file.)

 

restart; with(Statistics); rawdata := Import("https://health-infobase.canada.ca/src/data/covidLive/covid19-download.csv")

 

2) In terms of the question you ask, as an alternative to Carl Love's answer,  you may want to refer to the select/remove question in Maplesoft's "A Guide to Data Frames".  https://www.maplesoft.com/support/help/Maple/view.aspx?path=DataFrame%2fGuide#SelectRemoveValues

 

In this example, you want to "select" all data for which the value in the prname column of rawdata for is equivalent to name = "Ontario". Hence you want to evaluate (as a boolean) if the name in the column is "Ontario".

 

ont_data := select(proc (name) options operator, arrow; evalb(name = "Ontario") end proc, rawdata, prname)

module DataFrame () description "two-dimensional rich data container"; local columns, rows, data, binder; option object(BaseDataObject); end module

(1)

NULL

Download DataFrames_Select.mw

I won't solve your problem, but I get you started with the Maple problem - Explore command. You are missing the "parameters" parameter. (I also suggest adding the "initialvalues" parameter.")  The trough appears correctly for only certain values, so you might want to check the equations. (I added a bogus area function.) If you don't like the area in the caption, it could be put into the title. Trough.mw

Excuse the jpeg, but Mapleprimes will not display the 2021.1 code. 

 

Download simplify_example.mw

 

The protocal is to have Maple solve for y(t) and diff(y(t), t) and use the definition of diff(y(t), t, t) to plot both it and higher order derivatives. Kitonum's answer is the most efficient, but this one allows the reader to see how high order derivatives are generated.

(Note: I wrote this in Document mode with 2021 to try it out.)NULL

 

restart; plots:-setoptions(size = [500, 300], thickness = 2)

 

The second derivative of y(t) with respect to t is defined as:

"y2dot(t):=-y(t)*|y(t)|:"

 

Create the system:

ode := diff(y(t), t, t) = y2dot(t)
conditions := y(0) = 1, (D(y))(0) = 0

diff(diff(y(t), t), t) = -y(t)*abs(y(t))

(1)

 

I prefer to have Maple generate the procedures for each variables because it makes subsequent use of the "functions" more readable (and requires fewer commands to memorize)

solutions := dsolve({ode, conditions}, numeric, output = listprocedure)

 

Extract the functions from the solutions variable

y := eval(y(t), solutions); ydot := eval(diff(y(t), t), solutions)

 

plot([y(t), ydot(t), y2dot(t)], t = 0 .. 10, legend = ['y(t)', 'diff(y(t), t)', 'diff(y(t), t, t)'])

 

 

Calculate all higher derivatives which are defined in terms of lower derivatives. For example:

Y3dot := simplify(diff(y2dot(t), t)); Y4dot := simplify(diff(Y3dot, t))

(-abs(1, y(t))*y(t)-abs(y(t)))*(diff(diff(y(t), t), t))-(diff(y(t), t))^2*(y(t)*signum(1, y(t))+2*abs(1, y(t)))

(2)

NULL

 

Thus the higher order derivative functions are defined as:

"y3dot(t) :=-ydot(t)*(abs(1,y(t))*y(t)+|y(t)|):    y4dot(t):=(-abs(1,y(t)) y(t)-|y(t)|)*(y2dot(t))                            -(ydot(t))^2 *(y(t)* signum(1,y(t))+2*abs(1,y(t))):"

 

plot([y(t), y3dot(t), y4dot(t)], t = 0 .. 10, legend = ['y(t)', 'diff(y(t), t, t, t)', 'diff(y(t), t, t, t, t)'])

 

NULL


 

Download Plotting_higher_derivatives_numerically.mw

I think if the conditions are satisfied, it is solvable. I rewrote the integral in the form of constants. 

print(G) is probably the simpliest to show all the values within G. 

@tomleslie's was spot on. May I suggest an slight modification when you use dsolve - use the "output = listprocedure". Then you can extract out the procedure for x(t) and use it like a function. 

For fun, I tried out your toy problem. In the end, I agree with Tom - I don't see the difference and neither does Maple. I used pdsolve, not dsolve. 
 

restart

 

Write out differential equation and boundary value conditions

eq := diff(u(x), x, x) = u(x); bvc := u(0) = 2, u(1) = 1

sol := pdsolve({bvc, eq})

u(x) = (-2*exp(2*x-1)+2*exp(1)+exp(2*x)-1)*exp(-x+1)/(exp(2)-1)

(1)

u__sol := eval(u(x), sol); d2u__sol := simplify(diff(u__sol, x, x))

(-2*exp(2*x-1)+2*exp(1)+exp(2*x)-1)*exp(-x+1)/(exp(2)-1)

 

(-2*exp(2*x-1)+2*exp(1)+exp(2*x)-1)*exp(-x+1)/(exp(2)-1)

(2)

is(u__sol = d2u__sol)

true

(3)

plot(u__sol, x = 0 .. 1, 0 .. 3)

 

``


 

Download pdsolve.mw

Here is alternative approach that may mimic what you read in the textbooks...

Maple solves everything exactly unless instructed to solve numerically. Here is an alternative way to extract the numerical solution.

 

 

restart

 

Hmm, start with the equation for which we want the area within the ellipse...

eq := y^2 = x^3-3*x-1

 

Now, solve for the algebraic values for the "end points" along the x-axis of this ellipse... ( A tip of the hat to Kitonum for the plot.)

 

xpts := solve(rhs(eq) = 0)

(1/2)*(4+(4*I)*3^(1/2))^(1/3)+2/(4+(4*I)*3^(1/2))^(1/3), -(1/4)*(4+(4*I)*3^(1/2))^(1/3)-1/(4+(4*I)*3^(1/2))^(1/3)+((1/2)*I)*3^(1/2)*((1/2)*(4+(4*I)*3^(1/2))^(1/3)-2/(4+(4*I)*3^(1/2))^(1/3)), -(1/4)*(4+(4*I)*3^(1/2))^(1/3)-1/(4+(4*I)*3^(1/2))^(1/3)-((1/2)*I)*3^(1/2)*((1/2)*(4+(4*I)*3^(1/2))^(1/3)-2/(4+(4*I)*3^(1/2))^(1/3))

 

What does this mean numerically? Let's evaluate "floating point", i.e. numerically.

evalf(xpts)

1.879385242-0.1e-9*I, -1.532088886+0.2732050808e-9*I, -.3472963554-0.732050808e-10*I

 

It looks like the most negative value is the 2nd one, and the next most negative value is the 3rd one..

 

Let us "simplify" the extreme points before performing the calculation.

x__0 := simplify(xpts[2]); x__f := simplify(xpts[3])

-2*3^(1/2)*sin((4/9)*Pi)+2*cos((1/9)*Pi)

2*3^(1/2)*sin((4/9)*Pi)-4*cos((1/9)*Pi)

 

With this, I'll calculate the area within the ellipse. "x : `x__0` -> `x__f`  y = - sqrt(x^(3)-3 x-1) to sqrt(x^(3)-3 x-1)".

area := int(int(1, y = -sqrt(rhs(eq)) .. sqrt(rhs(eq))), x = x__0 .. x__f)

-(12/5)*3^(1/4)*(-3^(1/2)*cos((1/9)*Pi)+2*sin((4/9)*Pi)+sin((1/9)*Pi))^(1/2)*2^(1/2)*sin((4/9)*Pi)^(1/2)*(2*sin((1/9)*Pi)*3^(1/2)*EllipticE((-3^(1/2)*cos((1/9)*Pi)+2*cos((1/18)*Pi))^(1/2)/cos((7/18)*Pi)^(1/2), I*2^(1/2)*sin((1/9)*Pi)^(1/2)/(3^(1/2)*cos((1/9)*Pi)-sin((1/9)*Pi))^(1/2))+4*cos((1/9)*Pi)*EllipticF((-3^(1/2)*cos((1/9)*Pi)+2*cos((1/18)*Pi))^(1/2)/cos((7/18)*Pi)^(1/2), I*2^(1/2)*sin((1/9)*Pi)^(1/2)/(3^(1/2)*cos((1/9)*Pi)-sin((1/9)*Pi))^(1/2))-6*cos((1/9)*Pi)*EllipticE((-3^(1/2)*cos((1/9)*Pi)+2*cos((1/18)*Pi))^(1/2)/cos((7/18)*Pi)^(1/2), I*2^(1/2)*sin((1/9)*Pi)^(1/2)/(3^(1/2)*cos((1/9)*Pi)-sin((1/9)*Pi))^(1/2))+EllipticF((-3^(1/2)*cos((1/9)*Pi)+2*cos((1/18)*Pi))^(1/2)/cos((7/18)*Pi)^(1/2), I*2^(1/2)*sin((1/9)*Pi)^(1/2)/(3^(1/2)*cos((1/9)*Pi)-sin((1/9)*Pi))^(1/2)))/((3^(1/2)*cos((1/9)*Pi)-sin((1/9)*Pi))^(1/2)*(36*sin((4/9)*Pi)^2-24*3^(1/2)*sin((4/9)*Pi)*cos((1/9)*Pi)+12*cos((1/9)*Pi)^2-3)^(1/2))

 

Well, that is the exact value. What Paul is asking for is the numerical value. Again evaluate, "floating point".

evalf(area)

1.848519839-0.*I

NULL

Download Ellipse.mw

Substitute the { } for [ ] and it will be a list of lists.

@wolowizard
And here is the follow up to my terse reply late last night. It adds on to what @Carl Love nicely stated.

If you want to learn more about "lists" vs. "sets" vs. other data types, I recommend chapter 4 of the programming manual. (And one does not require switching out of 2D math to use it.)

https://www.maplesoft.com/support/help/Maple/view.aspx?path=ProgrammingGuide/Chapter04

f''(w) = 0

For a first derivative condition: 

f'(w) = diff_f_at_w_expression

 

Whether I use an indexed variable vs. an atomic one depends upon the problem I am trying to solve and how I wish to solve it. For example, if I have wish to write or refer to elements in a sequence, list or vector, being able to use indexed variables is quite valuable in readability and worksheet real estate. E.g. seq(a[n]*x^n, n=0..3). Such choices are made when I am writing code, which I perform nearly always within a Code Edit Region.  

However, if I am writing mathematical equations that I want non-Maple users to be able to read, particularly if including a subscript is informative, then I use an “atomic variable”. For writing mathematical equations and functions I use 2D-input because it makes the equations more readable and reduces the content on a page. The output of a 2D-input is repetative.

I agree with Carl Love, the atomic variable leads to fewer problems, particularly with new users, which, clearly, you are not. Many of the students in my courses prefer the image of the subscript provided within 2D input, such as F__x or F__Earth. However, when constructing such variables, too often they end up with the equivalent of F[x], only to discover that should they assign a value to x, their worksheet starts producing unexpected outcomes. Thus, I encourage them to avoid subscripts until they are more familiar with Maple.

There is a post on the evaluation of subscripts in Maple by Robert Lopez that might be of interest to readers: https://www.mapleprimes.com/maplesoftblog/208838-The-Saga-Of-The-Subscript

Personally, I enjoy atomic variables. They truly do make Maple input more readable, i.e., more aligned with what one sees in papers and textbooks.

 

Use 2D Input. Then, and only then,  the "dot" notation is available and can be found in the Calculus palette. 

 

When I am in your situaiton, I hit enter after the "x" to add another line. Then I hit the "Remove section" button on the Toolbar. (It is on the right in the circled region shown below.) This ends Section 1 and steps-left the cursor into the "Chapter 1" section. Then I hit "Insert section" button to add another section and step-right. I find this step-left / step-right structure logical since it is akin to what one uses in Word. 

If you end up with more lines in a section then desired, <ctrl>-<delete> (or <command>-<delete> for Mac) works to remove the entire line. 

I could see using this plot in my own courses. Others here are likely to give you some slicker ideas, but here is a start. All the plots are "plot", but one is of "style=point". I put the commands in a procedure so that you could pass it different functions.

 

restart


This procedure receives a function, f, that is to be plotted from a to b. N points are shown

NeatPlot := proc (f, a::numeric, b::numeric, N::posint, aclr::string) local x, n, lplot, dx, pts, fplot, pplot; fplot := plot(f(x), x = a .. b, thickness = 4, color = aclr); dx := (b-a)/(N-1); pts := [seq([x, f(x)], x = a .. b, dx)]; pplot := plot(pts, style = point, symbolsize = 20, symbol = solidcircle, color = aclr); x := a; for n to N do lplot[n] := plot([[x, f(x)], [x, 0]], thickness = 3, color = aclr); x := x+dx end do; plots:-display([fplot, pplot, seq(lplot[n], n = 1 .. N)]) end proc

"fsample(x):=cos(0.5*x)*(e)^(-0.1*x^(2)):  a:=evalf(2*Pi):    NeatPlot(fsample, -a, a, 13, "DodgerBlue");"

 

``

``


 

Download NeatPlot.mw

(Note - the grid lines don't show up when you execute it.) More work using textplot is needed to add the values of f(x) at x. 

3 4 5 6 7 Page 5 of 7