In a previous post, I wanted to compute the weighted average, with weight $ \overline{r}(x,y)$ , of the whole cartesian plane. This was not possible since the integrals did not converge.
Instead I’m computing the weighted average of points inside Region $ \mathcal{C}$ .
The definition of $ \overline{r}(x,y)$ is the average ray function
Suppose we have curve $ \mathcal{C}$ and a ray, from $ \mathbf{p}\in\mathcal{C}$ , rotating full circle at $ \Delta \theta$ increments while intersecting $ \mathcal{C}$ . We will denote the intersections as $ \left\{\mathbf{q}_i\right\}_{i=1}^{n}$ (for $ n$ intersections) and the length of the ray as $ r_i = \|{\mathbf{q}_i}\mathbf – \mathbf p\|$ .
Then as $ \Delta \theta\to0$ , the average radius function is $ \overline{r}(\mathbf{p})=\left(\sum\limits_{i=1}^{n}r_i\right)/{n}$
For star shaped curves, one can use an alternate and simpler definition
$ $ \overline{r}(\mathbf{p})=\frac1{2\pi}\oint_{\mathbf {q}_1\in\mathcal C}\|\mathbf {q}_1-\mathbf p\|\,\mathrm d\theta.$ $
Thanks to @Rahul, I have a code that can implement $ \overline{r}(x,y)$ . For example, if $ \mathcal{C}$ is defined by $ x^2+y^2+\sin(4x)+\sin(4y)=4$
curve = DiscretizeRegion[ ImplicitRegion[ x^2+y^2+Sin[4*x]+Sin[4*y] == 4, {{x, -3, 3}, {y, -4, 4}}], {{-3, 3}, {-4, 4}}, AccuracyGoal -> 8] q = MeshCoordinates[curve]; edges = First /@ MeshCells[curve, 1]; signedAngle[a_, b_] := Arg[(Complex @@ a)/(Complex @@ b)] avgRadius[p_] := 1/(2 \[Pi]) Abs[Sum[Module[{q1, q2, r, d\[Theta]}, q1 = q[[First@e]]; q2 = q[[Last@e]]; r = EuclideanDistance[p, (q1 + q2)/2];(*midpoint approximation*) d\[Theta] = signedAngle[q1 - p, q2 - p]; r d\[Theta]], {e, edges}]] avgRadius[{x, y}]
We can plot the contour of $ \overline{r}(x,y)$ on $ \mathcal{C}$ .
f = ContourPlot[avgRadius[{x, y}], {x, -3, 3}, {y, -3, 3}, Exclusions -> None, Contours -> 100, PlotLegends -> Automatic]
Hence the weighted average in $ \mathcal{C}$ is
$ $ \begin{array}{cc} {x_w=\frac{\int\int_{\mathcal{C}}x\overline{r}(x,y) \ dA }{\int\int_{\mathcal{C}}\overline{r}(x,y) \ dA}} & { y_w=\frac{\int\int_{\mathcal{C}} y\overline{r}(x,y) \ dA}{\int\int_{\mathcal{C}}\overline{r}(x,y) \ dA} }\end{array}$ $
However, even for the simplest double integrals, I’m unable to approximate using NIntegrate
In less than an hour.
x_w=(NIntegrate[x*avgRadius[{x,y}],{x,-10,10}, {y,-10,10}])/(NIntegrate[avgRadius[{x,y}],{x,-10,10},{y,-10,10}]) y_w=(NIntegrate[y*avgRadius[{x,y}],{x,-10,10},{y,-10,10}])/(NIntegrate[avgRadius[{x,y}],{x,-10,10},{y,-10,10}])
How do I do accurately and efficiently approximate the weighted average of the $ x$ and $ y$ -coordinates over the entire cartesian plane with weights $ \overline{r}(x,y)$ ?
“Accurately” means the error should be less than .00001. “Efficently” means computing the integral under $ 15$ minutes? I am unable to do so using NIntegrate