DMUG-Archiv 2010

Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

Re: Problem mit FindRoot

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.



Antworten:
Verweise:
Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

DMUG DMUG-Archiv, http://www.mathematica.ch/archiv.html