// Demonstration and test of solving systems of equations. use systemSolver2.frink symbolicMode[true] // Ellipse equations. ellipse = new System[[x^2/a^2 + y^2/b^2 === 1, e === sqrt[(a^2-b^2)/a^2], area===pi a b], ["pi"]] println["Ellipse:"] println[join["\n",ellipse.solveAll[]]] println[] println["System of equations with 2 unknowns:"] simult = new System[[x*y===8, x+y===4]] println[join["\n",simult.solveAll[]]] println[] println["System of equations with 4 unknowns:"] simult2 = new System[[3a - 2b + c === 3, 4a + b - 3c === 10, a + 6b - 2c === 5, d === 4c - 10 + 2b]] println[join["\n",simult2.solveAll[]]] println[] // Rump equation println["Rump equation:"] rump = new System[[z === ((333 + 3/4) - x^2) y^6 + x^2 (11x^2 y^2 - 121 y^4 - 2) + (5 + 1/2) y^8 + x/(2y), x===77617, y===33096]] println[join["\n",rump.solveAll[]]] println[] // Cohen, p. 11 /*cc = new System[[d0+d1+d2+d3+d4 === 1, d1+2d2+3d3+4d4 === 2(1-m), 3d0-d2+3d4 === 2g20 + g11, theta d0 + phi d1 - phi d3 - theta d4 === m, 2 theta d0 + phi d1 + phi d3 + 2 theta d4 === 2 g10], ["g20", "g11", "theta", "phi", "g10", "m"], true] println[join["\n",cc.solveAll[true]]] println[] */ // Expansion of the universe // TODO: Don't have solvers for exponential functions yet. println["Expansion of the universe:"] u = new System[[D0 hubbleconstant^2 e^(hubbleconstant t) === G m / d^2, d === D0, D0 === 4.3 ly], ["D0", "hubbleconstant", "ly", "G"]] println[join["\n",u.solveFor["t"]]] println[] // Circle println["Circle:"] circle = new System[[d === 2 r, c === pi d, a === pi r^2, e===f, g===h], ["pi"]] println[join["\n",circle.solveAll[]]] println[] // See http://answers.yahoo.com/question/index?qid=20091120001614AAInec3 // TODO: // eliminate pAprime and pAB, as those are what we want to solve for. println["Bayes equation:"] bayes = new System[[pAB === pBA pA / pB, pA === 1 - pAprime, pAB === ( pBA pA ) / ( pBA pA + pBAprime pAprime )], []] println[join["\n", bayes.solveAll[]]] println[] // Cylinder. See http://ask.metafilter.com/59183/Calculate-length-of-a-pipe-from-the-volume-it-holds // Basically, we want the solution for "L" given "d" and "v". println["Cylinder:"] cyl = new System[[d === 2 r, c === pi d, a === pi r ^2, v === a L], ["pi"]] println[join["\n", cyl.solveAll[]]] sols = cyl.solveFor["L"] println["Solutions for L:\n" + join["\n", sols]] // Plug in values and solve. args = [["d", 3/4 inch], ["v", 27 gallons]] nsols = cyl.solveForValues["L", args] println["Solutions for L (fully specified, symbolic):\n" + (nsols->"ft")] println["Solutions for L (evaluated):\n" + (eval[nsols]->"ft")] println[] // Not fully specified case. args = [["d", 3/4 inch]] nsols = cyl.solveForValues["L", args, false] println["Solutions for L (not fully specified):\n" + join["\n",nsols]] println[] // Phi println["The golden ratio Phi:"] phi = new System[[x+1===1/x]] sols = phi.solveAll[] println[join["\n", sols]] println[] // Test of parsing user-generated systems of equations. This will generally // fail with eval because of security constraints on creating objects. // Thus we're using unsafeEval. Hopefully in the future this can be done in // such a way that we can solve user-submitted systems of equations. Or we // may just have to do that in an applet or in the Frink UI. Burn your CPU // cycles, not mine! println["User-submitted system:"] s = unsafeEval["new System[[density === 3.5 oz / (170 yards),v === density], []]"] println[join["\n", s.solveFor["v"]]] println[] // Shweeb collision println["Shweeb collision"] phi = new System[[v === a t, d === 1/2 a t^2, E === 1/2 m v^2, E === m gravity h], ["gravity"]] println[join["\n", phi.solveAll[]]] args = [["d", 1.2 m], ["v", 30 km/hr], ["gravity", gee]] println["Acceleration: " + (eval[phi.solveForValues["a", args]]->"gee")] println["Height: " + (eval[phi.solveForValues["h", args]]->"ft")] println["Collision time:" + eval[phi.solveForValues["t", args]]] println[] // Physical system // Suppose the stone is thrown at an angle of 35.0° below // the horizontal from the same building (h = 50.0 m) as in the example above. // If it strikes the ground 60.8 m away, find the following. (Hint: For part // (a), use the equation for the x-displacement to eliminate v0t from the // equation for the y-displacement.) // (a) the time of flight // (b) the initial speed // (c) the speed and angle of the velocity vector with respect to the // horizontal println["Ballistics problem:"] phys = new System[[vx === v0 cos[35 degrees], vy0 === v0 sin[35 degrees], h === h0 - 1/2 g t^2 - vy0 t, x === vx t], ["g", "degrees"]] println[join["\n", phys.solveAll[]]] args = [["x", 60.8 m], ["h0", 50 m], ["g", gravity], ["h", 0 m]] println[join["\n", eval[phys.solveForValues["v0", args]]]] println[] // Jupiter gravity println["Jupiter gravity"] jup = new System[[ E === m g h, E === 1/2 m v^2], ["g"]] println[join["\n", jup.solveAll[]]] println[] // Lorentz equation println["Lorentz equation:"] lorentz = new System[[ gamma === 1/sqrt[1-v^2/c^2], dprime === d / gamma ], ["c"]] println[join["\n", lorentz.solveAll[]]] // Solve for when a distance of 5 km is compressed into 1 m args=[["d", 5 km], ["dprime", 1 m]] sols = lorentz.solveForValues["v", args] println[join["\n", sols]] println["Evaluated: " + eval[sols]] println[] // Photon travel from quantum electrodynamic calculations println["Photon equations:"] light = new System[[ f === c / lambda, omega === 2 pi f, f === 1/T, d === v t, v === c, phase === omega t], ["c", "pi"]] println[join["\n", light.solveAll[false]]] println[] // Deep fryer. How much oil do I need to buy to fill a cylinder to the // specified height? println["Deep fryer:"] fryer = new System[[ a === pi r^2, v === a h, d === 2 r ], ["pi"]] println[join["\n", fryer.solveAll[]]] args = [["d", 10.5 in], ["h", 7.5 in]] println[eval[fryer.solveForValues["v",args]] -> "gallons"] println[]