Ziege-Weide Aufgabe

https://de.wikipedia.org/wiki/Ziegenproblem_(Geometrie) (meine Loesung schaut aehnlich aus)

Das symbolischen Paket von Matlab wird benutzt so weit es geht und zum Schluss muss numerisch geloest werden.

Contents

Variablen

symbolisch (gesuchte Groessen)

clc; clear all; %clf;

% syms l real positive;
l = sym('l','positive');           % Leinenlaenge
% syms x real positive;
x = sym('x','positive');          % x-wert des Schnittpunktes Wiesenkreis mit Leinenkreis
% gegebene Groessen, hier als Zahlenwert
R = 10;                      % Wiesenradius
assumeAlso(l<2*R);

Die beiden Kurven (symbolisch)

yR = R - sqrt(R^2-x^2);
yL = sqrt(l^2-x^2);

bestimme den Schnittpunkt

X = solve(yL - yR, x);

% Ausgabe
disp('Schnittpunkt der beiden Kurven')
pretty(yR); pretty(yL)
disp('ist')
pretty(X)
Schnittpunkt der beiden Kurven
                 2
10 - sqrt(100 - x )

      2    2
sqrt(l  - x )

ist
      /   (l - 20) (l + 20) \
l sqrt| - ----------------- |
      \          100        /
-----------------------------
              2

unbestimmtes Integrieren

I = int(yL - yR, x);

Einsetzen der Integrationsgrenzen

==> abgegraste Flaeche, symbolische Funktion A(l)
A = 2*int(yL - yR, x, 0,X);

% Ausgabe
disp('abgegrasten Flaeche, Funktion A(l)')
pretty(A)
abgegrasten Flaeche, Funktion A(l)
                    3
    / l #1 \       l  #1              2
asin| ---- | 100 + ----- - 10 l #1 + l
    \  20  /         40

                         /   4            \
                         |  l     2       |
                l #1 sqrt| --- - l  + 100 |
       / #1 \            \ 400            /
   asin| -- | + ---------------------------
       \  2 /                2

where

             /       2 \
             |      l  |
   #1 == sqrt| 4 - --- |
             \     100 /


Aufstellen der Gleichung, sodass die halbe Flaeche abgegrast wurde

Hier konvertieren wir eine symbolische Funktion in eine numerische Funktion.

Fs= A - pi*R^2/2;          % symbolische Funktion
F = matlabFunction(Fs);    % numerische Funktion

% Grafik
% xx=linspace(0,2*R,1001);
% plot(xx,F(xx),[xx(1) xx(end)],[0 0 ],'b')
% title('A(L)-pi*R^2/2'); xlabel('L')

fplot(Fs,[0,2*R])
hold on
plot([0,2*R],[0 0 ],'b')
hold off
stringFs=strjoin(arrayfun(@char, Fs, 'uniform', 0));
title('Area = A(L)-pi*R^2/2'); xlabel('L')

numerisches Bestimmen der Nullstelle (= Loesung)

Hier wird nicht exakt gelöst !!
options = optimset('Display','iter');
L = fzero(F, R, options)                     % only with optimization package
%options = optimoptions(@fsolve,'Display','iter') % Wie geht das genau?
% options = optimoptions(optimoptions(fsolve),'Display','iter')
% L = fsolve(F,R)
 
Search for an interval around 10 containing a sign change:
 Func-count    a          f(a)             b          f(b)        Procedure
    1              10      -34.2427            10      -34.2427   initial interval
    3         9.71716      -40.1279       10.2828      -28.2823   search
    5             9.6      -42.5422          10.4      -25.7928   search
    7         9.43431       -45.932       10.5657      -22.2528   search
    9             9.2      -50.6744          10.8      -17.2101   search
   11         8.86863      -57.2728       11.1314      -10.0123   search
   13             8.4      -66.3711          11.6      0.280816   search
 
Search for a zero in the interval [8.4, 11.6]:
 Func-count    x          f(x)             Procedure
   13            11.6      0.280816        initial
   14         11.5865    -0.0169335        interpolation
   15         11.5873  -2.35373e-06        interpolation
   16         11.5873   3.90799e-14        interpolation
   17         11.5873   3.90799e-14        interpolation
 
Zero found in the interval [8.4, 11.6]

L =

   11.5873

Grafik

n  = 100;
% Leinenkurve
xxL = linspace(-L, L, n);
yyL = subs(subs(yL,l,L),x,xxL);
% Wiesenkurve
xxR = linspace(-R, R, n);
yyR = subs(yR,xxR);

plot(xxL,yyL,'r');
hold on;
plot(xxR,yyR,'b');
plot(xxR,2*R-yyR);
plot(xxL,R);
axis equal
title(['Weidenradius ',num2str(R),' m und Leinenlaenge ',num2str(L),' m']);
legend('Leine','Weide');

% publish('ziege_wiese.m');