Hallo Michael,
Natürlich könnte man schnell ein
Bisektionsverfahren oder so programmieren,
oder
In[15]:= Clear[gamerCircleIntersect]
gamerCircleIntersect[z1_Circle, z2_Circle] :=
Block[{x, y, x1, y1, r1, x2, y2, r2},
{x1, y1} = z1[[1]];
r1 = z1[[2]];
{x2, y2} = z2[[1]];
r2 = z2[[2]];
If[(x1 - x2)^2 + (y1 - y2)^2 >= (r1 + r2)^2, 0,
Integrate[
Boole[(x1 - x)^2 + (y1 - y)^2 <=
r1^2 && (x2 - x)^2 + (y2 - y)^2 <= r2^2],
{x, Min[x1 - r1, x2 - r2], Max[x1 + r1, x2 + r2]},
{y, Min[y1 - r1, y2 - r2], Max[y1 + r2, y2 + r2]}]]]
tippen und wunderhübsche analytische Resultate
In[19]:= gamerCircleIntersect[Circle[{1, 2}, 1/Sqrt[\[Pi]]],
Circle[{3/9, 2}, 1/Sqrt[\[Pi]]]]
Out[19]= -((2 (Sqrt[(9-\[Pi]) \[Pi]]-9 ArcSec[3/Sqrt[\[Pi]]]))/(9 \[Pi]))
erhalten.
zu Demonstrationszwecken habe ich die Berechnung des Schnittes zweier
Kreise via numerischer Integration dargestellt. Dazu dient mir die
Funktion A, definiert durch:
A[r_, R_, d_] := Module[{h, s = (R^2 - r^2 - d^2)/(2 d)},
h = Abs[Sqrt[r^2 - s^2]];
2 NIntegrate[ d + Sqrt[r^2 - x^2] - Sqrt[R^2 - x^2], {x, 0, h}]
A berechnet einfach die Schnittfläche der Kreise.
]
Um nun den Punkt zu bestimmen, an dem aus dem kleinen Kreis ein
bestimmter Wert ausgeschnitten wird wollte ich diese Fläche etwa mit
FindRoot[A[r, R, x] == 0.14, {x, R}]
das geht nicht (FindRoot hat Attribut HoldAll, dann klappt das mit der
Integrationsgrenze nicht). Wie kann ich es denn anstellen, eine
derartige Gleichung zu lösen.
In dem Module[], der A definiert, wurde die Variable x von der ausserhalb
ebenfalls verwendeten Variablen x nicht abgeschirmt, mit anderen Worten
In[67]:= Clear[gA]
Off[NIntegrate::nlim];
gA[r_, R_, d_] := Module[{h, s = (R^2 - r^2 - d^2)/(2 d), x, res},
h = Abs[Sqrt[r^2 - s^2]];
res = 2 NIntegrate[d + Sqrt[r^2 - x^2] - Sqrt[R^2 - x^2], {x, 0, h}];
res
]
In[71]:= FindRoot[gA[1, 2, x] == 0.88, {x, 2}]
Out[71]= {x -> 1.56701}
In[73]:= gA[1, 2, 1.56701]
Out[73]= 0.879995
Gruss
Udo.