Skip to main content

calculus and analysis - How to calculate specific area on surface of sphere?


I am trying to calculate the solid angle subtended by arbitrary-shaped loops on a sphere's surface.


First, I parametrize circular loops by:


$$\theta(t,k_{x0},r) = k_{x_0} + r \cos(t);$$ $$\phi(t,k_{y0},r) = k_{y_0} + r \sin(t);$$


where $0\leq t\leq2\pi$, and $k_{x_0}$, $k_{y_0}$ define the loop's center. So, we can say that this step draws out a circular loop on the $\theta/\phi$ plane.


Then I project these onto the sphere's surface using spherical coordinates, as follows:



$$x(\theta,\phi)=r \cos{\theta}\sin{\phi}, y(\theta,\phi)=r \sin{\theta}\sin{\phi}, z(\theta,\phi)=r \cos{\phi}$$


How do I go about calculating the surface area within these $(x,y,z)$ loops on the surface? This will allow me to calculate the solid angle I need.


The solid angle is given by: $$\Omega= \iint_S \frac{\hat{r}\cdot\hat{n}}{r^2} \, \mathrm{d}\Sigma = \iint_{\mathcal{R}}\sin \theta \, \mathrm{d} \theta \, \mathrm{d} \phi=\frac{\textrm{spherical surface area}}{r^2}$$


I tried using various types of RegionMeasures to calculate this area (such as defining the area within the loop on the sphere as a Region, and by varying the radius from 0 to r, calculating the length of each loop in between and summing it all up), but I feel like I am missing a simple answer to my problem. Maybe what I am missing is a way to somehow map my arbitrary loops into a appropriate integration bounds for $\Omega$, but I tried to avoid this by resorting to Mathematica.


So far, I found the following posts most useful:


Integrate to calculate enclosed area


https://math.stackexchange.com/questions/1832110/area-of-a-circle-on-sphere


Thanks in advance for your time!


Note: I am parametrizing these loops in a peculiar way because I am trying to investigate a physics problem where the functions $x(\theta,\phi),y(\theta,\phi),z(\theta,\phi)$ will be different, and make my loops twist and turn. The ultimate goal is to find the solid angle in these cases, but I wanted to start with the sphere.


Note: I posted a similar question before, but it was misinterpreted by answerers because I did a poor job phrasing it at first, and I am afraid that it lost attention and I still am clueless as to how to proceed (I did not want to delete it because others already put time into it).





Comments

Popular posts from this blog

How to thread a list

I have data in format data = {{a1, a2}, {b1, b2}, {c1, c2}, {d1, d2}} Tableform: I want to thread it to : tdata = {{{a1, b1}, {a2, b2}}, {{a1, c1}, {a2, c2}}, {{a1, d1}, {a2, d2}}} Tableform: And I would like to do better then pseudofunction[n_] := Transpose[{data2[[1]], data2[[n]]}]; SetAttributes[pseudofunction, Listable]; Range[2, 4] // pseudofunction Here is my benchmark data, where data3 is normal sample of real data. data3 = Drop[ExcelWorkBook[[Column1 ;; Column4]], None, 1]; data2 = {a #, b #, c #, d #} & /@ Range[1, 10^5]; data = RandomReal[{0, 1}, {10^6, 4}]; Here is my benchmark code kptnw[list_] := Transpose[{Table[First@#, {Length@# - 1}], Rest@#}, {3, 1, 2}] &@list kptnw2[list_] := Transpose[{ConstantArray[First@#, Length@# - 1], Rest@#}, {3, 1, 2}] &@list OleksandrR[list_] := Flatten[Outer[List, List@First[list], Rest[list], 1], {{2}, {1, 4}}] paradox2[list_] := Partition[Riffle[list[[1]], #], 2] & /@ Drop[list, 1] RM[list_] := FoldList[Transpose[{First@li...

front end - keyboard shortcut to invoke Insert new matrix

I frequently need to type in some matrices, and the menu command Insert > Table/Matrix > New... allows matrices with lines drawn between columns and rows, which is very helpful. I would like to make a keyboard shortcut for it, but cannot find the relevant frontend token command (4209405) for it. Since the FullForm[] and InputForm[] of matrices with lines drawn between rows and columns is the same as those without lines, it's hard to do this via 3rd party system-wide text expanders (e.g. autohotkey or atext on mac). How does one assign a keyboard shortcut for the menu item Insert > Table/Matrix > New... , preferably using only mathematica? Thanks! Answer In the MenuSetup.tr (for linux located in the $InstallationDirectory/SystemFiles/FrontEnd/TextResources/X/ directory), I changed the line MenuItem["&New...", "CreateGridBoxDialog"] to read MenuItem["&New...", "CreateGridBoxDialog", MenuKey["m", Modifiers-...

functions - Get leading series expansion term?

Given a function f[x] , I would like to have a function leadingSeries that returns just the leading term in the series around x=0 . For example: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x)] x and leadingSeries[(1/x + 2 + (1 - 1/x^3)/4)/(4 + x)] -(1/(16 x^3)) Is there such a function in Mathematica? Or maybe one can implement it efficiently? EDIT I finally went with the following implementation, based on Carl Woll 's answer: lds[ex_,x_]:=( (ex/.x->(x+O[x]^2))/.SeriesData[U_,Z_,L_List,Mi_,Ma_,De_]:>SeriesData[U,Z,{L[[1]]},Mi,Mi+1,De]//Quiet//Normal) The advantage is, that this one also properly works with functions whose leading term is a constant: lds[Exp[x],x] 1 Answer Update 1 Updated to eliminate SeriesData and to not return additional terms Perhaps you could use: leadingSeries[expr_, x_] := Normal[expr /. x->(x+O[x]^2) /. a_List :> Take[a, 1]] Then for your examples: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x), x] leadingSeries[Exp[x], x] leadingSeries[(1/x + 2 + (1 - 1/x...