Can I somehow specify that G is a vector in function definition so that it won’t complain?
c0[G_, \[Theta]0_, \[CapitalPhi]0_, Q_] :=
Normal@SeriesCoefficient[Sqrt[
G[[1]]^2 + G[[2]]^2 -
2 Q Sin[\[Theta]] (G[[1]] Cos[\[Phi]] +
G[[2]] Sin[\[Phi]])], {\[Theta], \[Theta]0,
0}, {\[Phi], \[Phi]0, 0}]
You can try with
c0[G_?VectorQ, \[Theta]0_, \[CapitalPhi]0_, Q_]
Beware that using capital letters for variables is not recommended in Mathematica.
dlkeith
(David Keith)
June 22, 2015, 5:40pm
4
Could you post an example of a complaint?
In[12]:= c0[G_, \[Theta]0_, \[CapitalPhi]0_, Q_] :=
Normal@SeriesCoefficient[
Sqrt[G[[1]]^2 + G[[2]]^2 -
2 Q Sin[\[Theta]] (G[[1]] Cos[\[Phi]] +
G[[2]] Sin[\[Phi]])], {\[Theta], \[Theta]0,
0}, {\[Phi], \[Phi]0, 0}]
In[13]:= c0[{a, b}, c, d, e]
Out[13]= Sqrt[a^2 + b^2 - 2 a e Cos[\[Phi]0] Sin[c] -
2 b e Sin[c] Sin[\[Phi]0]]
You are right, it works with SetDelayed, can we make it work with Set, so that the function will be evaluated right away instead of waiting?
Part::partd: Part specification G[[1]] is longer than depth of object. >>
dlkeith
(David Keith)
June 22, 2015, 5:54pm
6
In[17]:= c02[{g1_, g2_}, [Theta]0_, [CapitalPhi]0_, Q_] =
Normal@SeriesCoefficient[
Sqrt[g1^2 + g2^2 -
2 Q Sin[[Theta]] (g1 Cos[[Phi]] +
g2 Sin[[Phi]])], {[Theta], [Theta]0, 0}, {[Phi], [Phi]0,
0}]
Out[17]= Sqrt[g1^2 + g2^2 - 2 g1 Q Cos[\[Phi]0] Sin[\[Theta]0] -
2 g2 Q Sin[\[Theta]0] Sin[\[Phi]0]]
In[18]:= c02[{a, b}, c, d, e]
Out[18]= Sqrt[a^2 + b^2 - 2 a e Cos[\[Phi]0] Sin[c] -
2 b e Sin[c] Sin[\[Phi]0]]
I was just thinking that if G is multidimensional, say 100, there should be a way to pass it as an argument to a function.
What function of G do you have in mind? The following works with immediate assignment, but it won’t speed up calculations, I am afraid:
f[u_?VectorQ, v_?VectorQ] = u.v
Using vector notation you may write your function a little more elegantly
c02[g_?VectorQ, \[Theta]0_, \[CapitalPhi]0_, Q_] :=
Normal@SeriesCoefficient[
Sqrt[g.g -
2 Q Sin[\[Theta]] g.{Cos[\[Phi]],
Sin[\[Phi]]}], {\[Theta], \[Theta]0, 0}, {\[Phi], \[Phi]0, 0}]
but it only makes sense for a 2-dimensional g, and it only works with delayed assignment.
Also, I think SeriesCoefficient does not need Normal.
dlkeith
(David Keith)
June 22, 2015, 8:35pm
9
There are ways to use Hold to defer evaluation, but I have not encountered many cases where that is preferable to just defering the entire expression with SetDelayed.
In[1]:= tuplesPlus[x_, n_, y_] = Tuples[x, n] + y
During evaluation of In[1]:= Tuples::normal: Nonatomic expression expected at position 1 in Tuples[x,n]. >>
Out[1]= y + Tuples[x, n]
In[2]:= tuplesHeld[x_, n_, y_] = Hold[Tuples[x, n]] + y
Out[2]= y + Hold[Tuples[x, n]]
In[3]:= tuplesHeld[{a, b, c}, 2, d] // ReleaseHold
Out[3]= {{a + d, a + d}, {a + d, b + d}, {a + d, c + d}, {b + d,
a + d}, {b + d, b + d}, {b + d, c + d}, {c + d, a + d}, {c + d,
b + d}, {c + d, c + d}}