Project Outcomes:

It seems only fair to try to articulate what I am hoping you will learn from this project. My intended outcomes for this part of the course fall into three (3) general catagories. There are the physics outcomes -- can you apply core concepts from PH211/212/213 to a real world problem and build from simple physics models to more complex ones? There are the actual modeling/coding skills I would like you to gain so that you aren't starting from scratch in the many places coding might well become part of your career. Finally I want to send you out into the world with communication and documentation skills using common tools like python notebooks to create technical documents in engineering and science.

Physics/Engineering Project:

As I often go on about, many of the really interesting problems in our modern world are too complex to be able to write a clean (analytic) mathematical solution for. Computational models are a typical way to address these meaningful but challenging problems. Finite Element Analysis (FEM) is one form of computational analysis. There are fluid flow models and applications like SPICE for electronics. It's literally everywhere. Here are the skills I intend for you to demonstrate through your project:

1) Physical Reality: Demonstrate the ability to create an object that illustrates a particular physics concept or group of concepts.For some, or many of you, part of what makes physics and engineering interesting is the creation of actual widgets and things. A case in point are the Strandbeests created by Theo Jansen. It seems pretty clear how to build one and the instructions are widely available on line. I have seen many significant attempts by folks to build one and it turns out to be much more challenging than it looks. If you choose a project that has a physical object that illustrates the physics you may choose to attempt to construct this object. Doing so will be lovely but is not acceptable as the entirety of your project. Simplification and iteration are integral to any physical implementation.

2) Simplification: Demonstrate that you can take a complex physics/engineering setting and reduce it to a very simple form without losing all relevance. Then write code to implement this simple model and validate it (check) against experiment or data. This is where the physical implementation of your project will provide boundary conditions for your analysis.

3) Iterative Solutions: Demonstrate that you can attack a physics/engineering problem using an iterative model. This means you determine the characteristics of the system of interest at one moment or location in time and then predict where the system is a little later (further on). Repeat the analysis from the new state of the system and predict forward again. This methodology also allows you to introduce more complex physics behavior into your project analysis.

4) Multiparameter dependence: Demonstrate that you can begin to address the dependence of your project model (almost always the case) on a range of parameters. The friction may range from 0.1 to 1.0, the initial speed or angle can vary, and the direction of the wind. A key value of numerical models is the ability to explore, with relative ease, solutions for a whole range of conditions.

Physics/Engineering Coding Skills:

As I hope you have come to realize coding is exactly like learning a new langauge and like a language there are a variety of ways to learn it. One way is to take a series of courses and work your way through until you have some level of mastery. Works well. On the other hand, if you're going to Spain in a month that's not going to work so well. What do you do? Well, if you have a little experience with the language (you can read and write the words and pronounce them) you can figure out what you absolutely need to be able to say and just learn that. Not as useful as being fluent but it will work.This is the approach we have been taking in physics. You have seen many of the basic features of python coding in a physics context. Now you need to learn how to add skills that you specifically need for a particular task.

Here are the skills I intend for you to demonstrate through your project:

1) Accessing Libraries: In almost all coding languages somebody else or a team have developed a set of useful commands ease the burden of doing some family of operations like plotting or statistics. In python we will import various libraries that are typically used to create physics and engineering models. You will demonstrate that you know how to do this and which libraries are needed.

2) Basic Calculational Programming (Implement a simple algorithm): In the simple physics model you will create you will need to perform calculations like you have done in physics. Using a formula from kinematics or electrostatics to arrive at an answer. You will learn how to create variables and assign them values that are used in your calculation. You will learn how to communicate the result of those calculations to the user. You will demonstrate these skills in the first model you build for the project.

3) Loops, Vectors, and Iteration: The next coding tools you will learn have to do with the implementation of an iterative solution for your model. To redo the same calculation over and over again as your model moves through space or time requires the use of loops in some form and 'vectors' or lists which are an effective way of tracking the results of your repetitive calculations. You will demonstrate these skills in the second version of your model.

3) Debugging strategies: There are a host of metaphors that I'm tempted to use to explain why debugging the things that don't work in your code is the way it works for almost everyone. Construction metaphors, relationship metaphors, or cooking metaphors. Let's just say that when most of us analyze/code we always make mistakes. The greater question is how to notice those mistakes and then figure out what is actually wrong. Volumes have been written about debugging and I will introduce you to my very direct way of sorting out what I have done wrong. I wouldn't be surprised to learn some new strategies as we go though. You will demonstrate these skills in all of your Jupyter notebooks by leaving your debugging tools embedded in your code but commented out.

3) Plotting: Engineering and physics would be lost without plots. Another value of having some coding skills is that you can produce plots that make Excel whimper in the corner. Once you start generating iterative data in your model it will make sense to be able to plot various features of your model. You will demonstrate the ability to plot data in the Jupyter notebook containing the iterative model for your project.

Documentation Skills:

I know I go on about it all the time but it's a real thing. We all work in environments where the work that we do will be passed on to someone else in the future. It may seem like any fool could understand the fabulous engineering analysis/model you wrote but my experience is that I am often unsure of what my own code means a year after I wrote it. Documenting what your code is doing in language that is broadly understandable is just good practice. In the world of STEM that you are participating in this includes the need to be able to create beautiful documents with formulae and images and plots. Here are the skills I intend for you to demonstrate through your project:

1) Embedding Math: In each of the stages of your project you will need to represent the mathematical model you are using in the descriptive part of your notebook.

2) Embedding code: In each of the stages of your project you will need to discuss and describe the code you have written in your notebook. Describing the code is done in the markdown cells as well as in the actual python code.

3) The usual highly effective technical communication: Each of your notebooks will be evaluated against a ridiculous standard for good technical communication.