August 24, 2017
Eric Rasmusen, erasmuse@indiana.edu
This file is now at http://www.rasmusen.org/a/mathematica.rasmusen.txt
These notes are latest Mathematica tips and tricks that I have found
useful or thought might be useful. I wrote these for my own use and
have not tried to make them clear for others, but some other people
will find them useful.
**********************************************************
CLEARING VARIABLE VALUES
At the start of the cell, put:
Clear["Global`*"] (*This allows you to clear all the variable values \as needed.*)
**********************************************************

NUMERICAL INTGRATION AND MINIMIZATION
You have to have all of the numerical integration inside your minimand function AND write it like this so it doesn't try to evalute the numerical integral with the symbol instead of the specific number it is trying out for the minimization:
minimand[a0_,a1_?NumericQ] = a0 + NIntegrate[a0*p/(a0+a1), {p, 1, 100}]

TURNING A RULE INTO AN EXPRESSION
Solutions give output like
z= {{x>x^2=4}},which is a "rule". It must be reduced to an expression or a number to be useful. First you do temp1=Part[z,1] to get rid of the outer brackets. If the rule were z= {{x>
x^2+4},{x>3} } it would take out just the first one and gives you {x>x^2+4}.Then to make it an expression called qb1, do this:
qb1= x /. temp1 That says qb1 = x^2+4
You can do this with a bunch of variables too.
result1 ={a>34, b>45}
{a, b} = {a,b}/.result1
I'm not absolutely sure that this works, tho.
To make a function f[x]=x^2+4, follow up the last command with
f[x_]:=qb1 . Then f[7] = 53.
Here is an example where we get just a number out:
In[63]= temp1 = Solve[24  2 p == p  16]
temp2 = Part[temp1, 1]
p = p /. temp2
Out[64]= {{p > 40/3}}
Out[65]= {p > 40/3}
Out[66]= 40/3
EASY EXAMPLE OF GETTING A NUMBER OUT FROM MAXIMIZATION
Maximize[qprofit, w]
temp1 = N[Part[%, 2]]
wmax = w /. temp1
OUT[42]: {3481/8, {w > 99/40}}
OUT[43]: {w > 2.475}
OUT[44]: 2.475
Look for How to Use Rule Solutions in Help.
RUles can be used to put specific parameters into plots:
Plot[v /. {s > 3}, {p, 0, 1}]
a1 = Plot[ {{return[.4], return[.01], return[.08], return[.15]} /.
s > 1.5 } , {r, 0, 1.5} ]
Another example, with two optimal solutions coming from a maximization where I want to then set the variable value equal to the optimal solution in expressions b, w, and welfare:
temp = NMaximize[{welfare, s > 0, s < sbar, p > 0, p < 1}, {s, p}]
temp1 = Part[temp, 2]
temp2 = Part[temp1, 1]
sstar = s /. %
temp3 = Part[temp1, 2]
pstar = p /. %
s = sstar
p = pstar
Print["b = ", b]
Print["w = ", w]
Print["welfare=", welfare]
SOLVE: can be done like this:
qd = a  b*p ; qs = c + d*(p  c/d  c ) ; temp1 = p /. Part[Solve [qd == qs, p], 1]

iuanyware.edu has Mathematica, STATA and other program useable from anywhere. You first download the Citrix receiver program and install that. It will have access to the C: directory of your computer.
You can open and save files to your home computer as C: or D:, but if you export a figrue or other file it disappears onto c:Users/erasmuse/Documents on the rmote inaccessible server.
**********************************************************
PLOTTING, TABLES, AND TITLES OF FIGURES
I have had the wrong approach to this. What is best is to use the coding to make the elements of the plot and the text labels, but then to use the interactive TOOLS to make the diagram look pretty. That is quicker, and it isn't bad even to reproduce.
In Drawing Tools, CTRLV will make Mathematica close.
To plot a function, use Plot[f[t], {t, 0, vmax + 1}].
VERTICAL LINES at discontinuities in a plot are inserted if you say
Plot[f[t], {t, 0, vmax + 1}, Exclusions>None].
TO PUT TEXT INTO A PLOT and then save the plot:
plot1 = Plot[{P = 2 Q, P = 48  3 Q, P = Q}, {Q, 0, 15}];
plot2 = Graphics[Text["Demand", {4, 40}, BaseStyle > {FontWeight > "Bold", FontSize > 14}] ];
finished = Show[plot1, plot2, AxesLabel > {"Q", "P"},
BaseStyle > {FontWeight > "Bold", FontSize > 14}]
Export["ans065.msc.pdf", finished]
To just get decimalized values for an expression at 4 values, not a plot, do this:
myname= Sin[x]/2
N[Table [myname, {x, {2.3, 1.1, 0, 10}}] ]
or without decimalization, and for values from 1 to 10,
Table [myname, {x,1,10} ]
OPEN CIRCLES AND AXES IN DIAGRAMS
A problem is that mathematica won't add anything to a diagram outside the plotrange, and the axis
goes all the way to the edge of it. To solve that , use AxesStyle > White, TicksStyle > {Black,
Black}, which keeps the axes lables and ticks but makes the axes white. Then draw lines in to
represent the axes,e.g., Line[{{0, 0}, {12, 0}}], Line[{{0, 0}, {0, 14}}]
I couldn't get opaque circles, even tho Mathematica has commands that supposed put some objects in
front and make them opaque.
STANDARD PLOT OPTIONS:
AxesOrigin > {0, 0}, PlotRange > {{6, 0}, {0, 6}}, AspectRatio > 1/1,AxesLabel>
{"Firm 2's Output","Firm 1's Output" }, PlotStyle > {Thickness[.009],
Dashing[{0.03, 0.01}], PointSize[.02]}, Ticks > {{1, 1.5, 2}, {1, .5, 0 }}]
All of the Plotsttyle stuff must go in one Plotstyle command.
Mathematica has a MayraPaintbrush style drawing tools under the GRaphics menu. It
doesn't have bezier curves, tho.
Here is a 3D plot. First is the function, then the range for each dimension, with an
option for a 0,0 origin:
Plot3D[
Sin[x y],
{x,0, 3},
{y, 0, 3},AxesOrigin={0,0}]

HERE IS HOW TO PUT THREE PLOTS SIDE BY SIDE:
plot1 = Graphics[GraphicsArray[{plot2x, plot3x, plot1x}]]

ListPlot[{{{1, 2}, {4, 4}}, {{1, 3}, {4, 4}}}, Joined > True, AxesOrigin > {0,
0},ListPlot[{{{1, 2}, {4, 4}}, {{1, 3}, {4, 4}}}, Joined > True,
AxesOrigin > {0, 0}, PlotRange > {{6, 0}, {0, 6}}]]
This will generate two line segments on one graph, each from one point to another.
The Joined option makes them line segements instead of just 4 points. PlotRange
gives the two points for the SE and NW corners of the graph.
Below is code I used to make a reaction curve diagram. It could be improved, but it does OK.
plot1=Plot[{{120  2 q}, {60  q}, {60q/2}}, {q, 0, 120}]
plot2 = ListPlot[{{0, 60}, {30,30}, {40,40}, {60,0}}, PlotStyle > PointSize[.02]]
Show[plot2, plot1, PlotRange > {{0, 130}, {0, 130}},
AspectRatio > 1/1]
plot3 = Graphics[Text["Firm 1's Reaction Curve", {80,30}]]
plot4= Graphics[Text["Firm 2's Reaction Curve", {30,80}]]
plot5 = Graphics[Text["Cournot equilibrium", {42,42}]]
plot6 = Graphics[Text["Cartel Output", {32,32}]]
Show[plot2, plot1,plot4, plot3, plot5, plot6, PlotRange > {{0, 130}, {0, 130}},
AspectRatio > 1/1, AxesLabel>{"Firm 2's Output","Firm 1's Output" }]
I think I could just have Text["Firm 1's Reaction Curve"] with the Graphics outside
it.
Here is another success:
pstar1 = 2  4/v;
pstar2 = (v/2  1)/(3 v/4  1);
Table[{pstar1, pstar2}, {v, 2, 3, .1}] ;
plot1 = Plot[{pstar1, pstar2 }, {v, 2, 3},
AxesLabel > {"Prize/cost (V/c)", "P_{even}"},
PlotRange > {{2, 3}, {0, .6}},
Ticks > {{2, 2.5, 3}, {0, .25, .5}} , AspectRatio > 1/1,
PlotStyle > {{Thick, Thick},
Dashing[{0.03, 0.01}] }] ;
plot3 = Graphics[Text["Rival 2 first", {2.8, .44} ]];
Show[plot1, plot3, PlotRange > {{2, 3}, {0, .7}}]

DATA PLOTTING DATA ENTRY
Clear["Global`*"]
SetDirectory["C:/__PAPERS1stCURRENT1sttier/LostDecade/graphs"]
FileNames[]
Directory[]
gg = Import["jan6b.csv"]
That tells the current directory, shows the files and folders in it, and changes it.
Put the data into a csv file with no labels, e.g. jan6a,csv.Set the working
directory and import the data into a list. To see it as a matrix, use
MatrixForm[gg]. The rows are years and the columns are variables. To create a year
vector or a variable vector, type:
y1980 = gg[[5]]
gdp = gg[[All, 2]]
To plot one variable or two, or make a fancier plot:
ListLinePlot[gg[[All, 2]], DataRange > {1980, 2010}]
ListLinePlot[{gg[[All, 2]], gg[[All, 4]]}, DataRange > {1980, 2010}]
plot1 = ListPlot[gdp, DataRange > {1961, 2010},
AxesLabel > {"Year", "Growth in GDP per Capita"}, Filling > Axis,
FillingStyle > Red]

Hre is how I inputted my tex equation, called it x1, and then had Mathematica sovle it out for r:
x1 = ToExpression["5+ \\frac{1}{1+r} \\frac{2}{r} =
(\\frac{1}{1+r})^2 \\left( 30 \\right)", TeXForm]
NSolve[x1, r]
**********************************************************
SendMail["From" > "erasmuse@indiana.edu",
"To" > "erasmuse@indiana.edu",
"Subject" > "Sending Email from Wolfram Language",
"Body" > "Testing", "Server" > "mailrelay.iu.edu"]
This will send email. Possibly, anybody can send email pretnending it is from someone else.
**********************************************************
At the start of every file put:
(* Date and title *)
SetOptions[Plot,
AxesOrigin > {0, 0}]; SetOptions[Plot3D, {AxesOrigin > {0, 0, 0},
Axes > True}]; SetOptions[Graphics, {AxesOrigin > {0, 0},
Axes > True}]; SetOptions[Graphics3D, {AxesOrigin > {0, 0, 0},
Axes > True}];
Clear["Global`*"] (*This allows you to clear all the variable values \
as needed.*)
I have Mathematica 6, site license L28898203. NOw I have 8.
Googling often works better than the official help site.
http://www.pa.msu.edu/~duxbury/MathemIntro.html is a very good list of tips.
https://pantherfile.uwm.edu/sorbello/www/classes/mathematica_commands.html A very
good list of important Mathmetica commands.
http://www.wolfram.com/solutions/highered/homeuse.cgi
For getting started:
http://www.indiana.edu/~statmath/math/mma/gettingstarted/doingmath.htm
l
The company documentation site:
http://reference.wolfram.com/mathematica/guide/Mathematica.html?docs
http://reference.wolfram.com/mathematica/guide/Mathematica.html
For my old input and output files for mathematica diagrams, go to:
http://www.rasmusen.org/a/math/

Go up to the Evaluation tab to actually do the things you've typed in,
or do SHIFTENTER.
Clear["Global`*"] for clearing everythign. I can make a macro by defining
clearing1= Clear["Global`*"] and SHIFTENTER on its output.
For a Greek alpha in a text label, try this:
\[Alpha]
CTRLZ undoes the previous command.
\[Element] gives the "in" element of sign.
Sqrt[5] gives the square root of 5.

ANIMATIONSTRYING OUT DIFFERENTP PARAMETER VALUES
This will give a slider bar to try changing f in values in [1,5].
Animate[Plot[(f/q) + q, {q, 0, 10}], {f, 1, 5},
AnimationRunning > False]
You can make a slider that changes the value of x wherever you've made something dynamic by putting
the Dynamic command around it, going back and changing the value from what you put in earlier.
Slider[Dynamic [x ], {0, 10 }]
The next command makes a local slider that just changes x for inside the square brackets
DynamicModule[{x }, {Slider[Dynamic[x], {0, 1}], Dynamic[x],
Dynamic[Plot[y^x , {y, 0, 3}] ] } ]
Here, we create a twople point x that we can vary by dragging the point in the control:
Control[{x, {0, 0}, {1, 1}}]
Dynamic[x]
Dynamic[x^2]
Graphics[Line[{Dynamic[x], Dynamic[x^2]}] ]

FINDING THE SIGN OF AN EXPRESSION
Start with
Sign[x^2+1]
Then use
Simplify [y, {x \[Element] Reals}]
And it will return 1, because it is positive. Or, just do
Simplify[Sign[x^2+1]]

PROGRAMMING
Use the WHILE command.

COMBINATORICS
Needs["Combinatorica`"] This is MAYBE needed for the KSubsets command.
KSubsets[variables, 3] gives the 3element Combinations of the file variables

COMMENTS
Right click on a selection and you get a menu which allows you to comment or
uncomment that selection.
2. I want a macro that will make comments a onecharacter thing as in Latex %. How
can I make a macro for that?

(* Here is a comment *)
p=x3+3x2+3x+1
Solve[p==0]
Here is how to expand the previous output, called %:
Expand[%]
Simplify[%]
Here is a function defined:
f[x_]:=x^2
and the function can be used like this:
f[2]

POLYGONS VS LINEPLOTS
Graphics[{ Opacity [0.3], EdgeForm[Thick],
Polygon[{{0, 0}, {1, 1}, { 2, 4}, {3, 1}},
VertexColors > {Red, Green, Blue}] } ]
ListPlot[{{0, 0}, {1, 1}, { 2, 4}, {3, 1}}, Joined > True]
Listplot puts the same points on a graph with an axis but with the points not all
connected.

Here is how to get Pi to 20 digits:
N[Pi,20]
Here is how to make the previous expression into decimal form:
N[%]


TEXT
caption1 = Text[Style[Subscript[w, 0], FontSize > 14] ]
caption1 = Text [Style[ "fun(w)" , FontSize > 18,FontFamily > "Helvetica"]] ]
Better, for subscripts type CTRLminus and then whatever is in the subscript
"To set font for all future graphics text: $TextStyle command is not in Math
6,7,8. It is replaced by the DefaultBaseStyle command, which I can't get to work and
which is poorly documented. Stylesheets are mixed up in that oo.
You can use the FORMAT menu to change the appearance of highlighted things in the
notebook. Don't highlight items on the Plot itselfdo it on the PLot command that
creates the chart.


http://reference.wolfram.com/legacy/teachersedition/MathematicaBook/31.2.html
http://www.physics.mun.ca/~cdeacon/laboratories/graphs/graphplot.pdf
I coudl not get the Export command to work to go to a particular location. Instead,
just rightclick on the ojbect and save to a pdf file wherever you like

Plot[ PDF[NormalDistribution[0, 1], x], {x, 2, 2}, Filling > Axis]

FOR A DEMAND CURVE AND INVERSE DEMAND CURVE BASED ON VALUE DISTIRUBITON f(x)
f[x_] := PDF[NormalDistribution[4, 2], x]
q[p_] := Integrate[f[x], {x, p, 8}]
Plot[ q[p], {p, 0, 7}]
sol= Solve[
q[p1] == q, p1
]
p2 = Max[0, p1 /. sol]
Plot[p2, {q, 0, 7}]
p1[q_ ] := Max[12  2 q , 0]
sol = Solve[p1[q] == p, q]
q4[x_] := Max[0, Evaluate[q /. sol[[1]] /. p > x] ]
q4[20]
Plot[q4[p], {p, 0, 20}]
Plot[Max[0, 2(2 + Sqrt[2] InverseErf[2 x + Erf[Sqrt[2]]])], {x,0,
1.1} ]
c=7
p[x_] := Max[0, 20  x^2]
out1 = N[Maximize [{ p[x]*x  c*x, x > 0} , x]]
xmaxp = x /. Part[out1, 2]
profitmaxp = Part[out1, 1]
xsocialmaxp = w/. Part[Solve[p[w]==c, w],2]
surplusp = N[Integrate[p[x], {x,0,xsocialmaxp}]]c*xsocialmaxp
c=7
r[x_] := Max[0, (x+2)^(1/3) ]
out1 = N[Maximize [{ r[x]*x  c*x, x > 0} , x]]
xmaxr = x /. Part[out1, 2]
profitmaxr = Part[out1, 1]
xsocialmaxr = w/. Part[Solve[r[w]==c, w],2]
surplusr = N[Integrate[r[x], {x,0,xsocialmaxr}]]c*xsocialmaxr

A DIAGRAM
p1[q_] := If[q < 1, (mu + s1/2)  s1*q, 0]
p2[q_] := If[q < 1, (mu + s2/2)  s2*q, 0]
plot1 = Plot[{c, p1[q] , p2[q] }, {q, 0, 2}, PlotStyle > {Thickness[.009]} ];
plot2 = Graphics[Text["p1(q)", {mu/8 + .2, 2.5}]];
plot3 = Graphics[Text["p2(q)", {mu/4 + .1, 2.5}]];
plot4 = Graphics[Text["Marginal Cost, c", {1.2, c + .11}]];
Show[plot1, plot2, plot3, plot4,
PlotRange > {{0, 1.5}, {0, mu + s1 + .5}}, AspectRatio > 1/1,
AxesLabel > {"Quantity", "Price"}]

The InverseFunction command is a trap. It only gives output useable for symbolic
manipulation, not for actual functions. Use Solve instead.
http://www.mathkb.com/Uwe/Forum.aspx/mathematica/16077/Inversefunction
http://reference.wolfram.com/mathematica/tutorial/PureFunctions.html Pure functions
use the pound sign and ampersand. If you are going to use a particular function
repeatedly, then you can define the function using f[x_]:=body, and refer to the
function by its name f. On the other hand, if you only intend to use a function
once, you will probably find it better to give the function in pure function form,
without ever naming it.
Mathematica to TeX conversion: TeXForm[z = 3x^2/2]
This does not work for graphicsthey will not convert to Tex.
TeX to Mathematica conversion: ToExpression["input",TeXForm], where, for example,
input = \sqrt{b^24ac}

FUN STUFF
Maybe use this unbounded variation example for my quasi.tex paper:
Plot [ Sin[1/x], {x, 0, .1} ]
Graphics3D[
Sphere[{0, 0, 0}, 3]
]
Graphics3D[
{Blue,
Sphere[{0, 0, 0}, 3]}
]
Graphics3D[
{
Green, Cuboid[{.1, 0, 0}, {.2, .3, .2}],
Blue, Cuboid[{0, 0, 0}, {.1, .1, .1}]
}
]

Questions.
3. How can I make a default diagram style?

SUPPLY AND DMEAND DIAGRAMS
ls[l_] := 5 + 3 l;
ld[q_] := 20  4 q ;
mr[l_] := 20  8 l;
Solve [ld[l] == ls[l]] ;
temp = l /. %;
l0 = temp[[1]];
w0 = ld [l0] ;
Solve [mr[l] == ls[l]]
temp = l /. %;
l1 = temp[[1]]
w1 = ld[l1]
plot1 = Plot[ld[q], {q, 0, 5}] ;
plot2 = Plot[ mr[l], {l, 0, 24}] ;
plot3 = Plot[ ls[l], {l, 0, 24}] ;
plot4 = Graphics[
Text[Style[Subscript[w, 0], FontSize > 14], {.25, w0}]] ;
plot5 = Graphics[
Text[Style[Subscript[w, 1], FontSize > 14], {.25, w1 }]] ;
plot6 = Graphics[
Text[Style[Subscript[L, 0], FontSize > 14], {l0, 1}]] ;
a = Graphics[Text[Style[Subscript[L, 1], FontSize > 14], {l1, 1}]] ;
b = Graphics[
Text[Style["Demand by employers", FontSize > 14], {3.3, 5}]] ;
c = Graphics[
Text[Style["Marginal revenue", FontSize > 14], {3, 2}]] ;
d = Graphics[
Text[Style["Supply by workers", FontSize > 14], {3.5, 15}]] ;
e = Graphics[ Text[Style["A", FontSize > 20], {0.5, 16}] ] ;
f = Graphics[ Text[Style["B", FontSize > 20], {0.9, 13}] ] ;
g = Graphics[ Text[Style["C", FontSize > 20], {1.6, 12.5}] ] ;
h = Graphics[ Text[Style["D", FontSize > 20], {1.2, 10}] ] ;
i = Graphics[ Text[Style["E", FontSize > 20], {1.5, 10.5}] ] ;
j = Graphics[ Text[Style["F", FontSize > 20], {0.5, 7.5}] ] ;
plot7 = ListPlot[{{0, w0}, {l0, w0} , {l1, w1}, {l0, 0}, {l1, 0}, {0,
w1}, {l1, mr[l1]}}, PlotStyle > PointSize[.02]] ;
plot8 = ListPlot[{{{l1, mr[l1]}, {0, mr[l1]}}, {{0, w0}, {l0,
w0}}, {{0, w1}, {l1, w1}}, {{l1, w1}, {l1, mr[l1]}}},
Joined > True, PlotStyle > { Dashing[{.01}]} ];
Show[plot1, plot2, plot3, plot4, plot5, plot6, plot7, plot8, a, b, c, \
d, e, f, g, h, i, j, PlotRange > {{.3, 4.5}, {3, 23}},
AxesLabel > {"Hours of Labor", "Wage"}, AxesOrigin > {0, 0},
AspectRatio > 1/1]

ParametricPlot[{Sin[t], Cos[t]}, {t, 3, 3}
This gives a circle
ParametricPlot[{t, t^2}, {t, 3, 3}
A parabola
ParametricPlot[{t, 1/t}, {t, 3, 3}
A hyperbola