Homework Assignments - PerimeterInstitute/Julia-Course-Fall-2015 GitHub Wiki

Homework Assignments

Homework 1: Quaternions

This assignment teaches defining a new type, and associating functions with that type.

Define a parameterized type that implements quaternions. Define respective functions for addition, subtraction, multiplication, and division.

Note:

  • You should import the operators +, -, *, and / from Base
  • Provide ways to convert real numbers to quaternions, and to extract the quaternion components as real numbers
  • Make the type immutable for efficiency and convenience
  • The quaternion type should be a subtype of Number
  • Use Julia's @test mechanism (see the users' guide) to define tests for each arithmetic operation
  • Place your code (either notebook or script) into a git repository so that others can look at and comment on it

Homework 2: Secant method

This assignment teaches implementing simple algorithms with loops and conditionals.

Define a function secant that takes as input

  • a function f
  • a lower bound xlo
  • an upper bound xhi
  • a resolution dx

that finds a root of f in the interval [xlo:xhi] with a resolution of dx. That is, the function secant should iteratively reduce the size of the interval until it is smaller than dx, bracketing a root of f.

Note:

  • Check initially whether there is actually a root inside the interval, i.e. whether f(xlo) and f(xhi) have different sign
  • Use the secant method; alternatively, use the bisection method which is slower, but slightly easier to implement
  • If you pass a function as argument to a function, it is customary to not specify a type constraint for this argument, as in function secant(f, xlo::Real, xhi::Real, dx::Real)
  • To test performance (in the sense of number of iterations required), use the info command to output a message during each iteration
  • As a test, find the value of sqrt(2) to 100 digits. Hint: Solve x^2-2==0, and use the BigFloat type.

Homework 3: Matrix multiplication

This assignment teaches linear algebra operations via explicit for loops.

Write a function that accepts as input two rank-3 tensors A_kil and B_ljk, and that calculate the traces T_ij := A_kil B_ljk.

  • Calculate this trace via explicit for loops
  • Use reshape to calculate the traces also via built-in linear algebra calls, i.e. without for loops
  • Compare code size, clarity, time needed to develop the code, and performance (using @time, for reasonably large matrices)