Afstand maximaliseren?

Wiskunde is niet alleen een vak op school. Kom je ergens in de praktijk (bijvoorbeeld tijdens je werk) een wiskundig probleem tegen dan kun je hier om hulp vragen.

Afstand maximaliseren?

Berichtdoor Art666 » 21 Jul 2017, 11:49

Hoi,

Eerst maar een plaatje:

Afbeelding

Het gaat over het hijsen van een object. A is het hijspunt (de haak) van de kraan, dit is een vast punt.
Het blauwe vierkant met de punten B en F is een balk die er tussen wordt gehangen. Op die balk zitten bevestigingspunten (B en F) voor de kabels. De positie van de punten B en F op de balk zijn vast ten opzichte van de balk, die relatieve positie is ook bekend.
Het zwarte vierkant is het te hijsen object, de punten C en E zijn hijspunten en die liggen weer vast op het object. De positie van de punten op het object zijn bekend.
Punt D is het zwaartepunt van het object. De positie relatief t.o.v. het object is bekend.
De lengtes van de kabels zijn bekend. De afstanden van AF, AB, FE, BC, ED en CD zijn allemaal bekend, ze kunnen allemaal verschillend zijn.
Theoretisch is het nu mogelijk om de blauwe balk naar links of rechts te bewegen, waarbij alle lijnen dezelfde lengte behouden. Wat dan wel gaat gebeuren is dat het object zelf zal roteren.
D was het zwaartepunt, als gehesen wordt, zal het zwaartepunt altijd verticaal precies onder de haak (A) komen te hangen. Met andere woorden de lengte van de rode lijn AD zal maximaal worden.
Ik wil nu graag de posities van de punten bepalen, daarvoor hebben we eerst een x,y stelsel nodig. Laten we het 0 punt in A leggen.

De vraag: Hoe kan ik uitrekenen wat de positie van F en B is wanneer AD zijn maximale lengte heeft.

Met vriendelijke groet,
Art
Art666
Nieuw lid
Nieuw lid
 
Berichten: 5
Geregistreerd: 15 Mei 2017, 15:18

Re: Afstand maximaliseren?

Berichtdoor Art666 » 05 Sep 2017, 09:37

Beste slimmerikken,

De vakantie is volgens mij weer voorbij, dus misschien komen er ook wat meer mensen op deze site.
Ik heb nog geen antwoord op mijn vraag kunnen vinden, dus als er iemand is die me in de goede richting kan helpen dan waardeer ik dat zeer.

Met vriendelijke groet,
Art
Art666
Nieuw lid
Nieuw lid
 
Berichten: 5
Geregistreerd: 15 Mei 2017, 15:18

Re: Afstand maximaliseren?

Berichtdoor arie » 06 Sep 2017, 15:24

Een numerieke oplossing:
Definieer een assenstelsel met punt A in de oorsprong, punt D daaronder op de y-as:
A = (0, 0)
D = (0, dy)
Maximaliseren van de afstand AD betekent: bepaal de minimale (= meest negatieve) waarde van dy.

In een plaatje:

Afbeelding

Hierin zijn alle afstanden globaal in dezelfde verhouding als in jouw plaatje:
af = 6.0
ab = 7.0
fb = 5.2
bc = 11.0
ef = 8.0
cd = 5.0
de = 9.8
ec = 10.5
Noot: als de posities van punten C, D en E op het object gegeven zijn, dan kan je de afstand ec (rood in mijn plaatje) dus berekenen of meten.

De zijden van driehoek ABF liggen vast, punt A ook, maar de hele driehoek mag nog roteren om punt A.
Als we ook hoek DAF definieren, dan ligt de hele driehoek ABF vast.
We kunnen dan de coördinaten van punten F en B bepalen (bij deze gekozen hoek DAF).

Ook de zijden van driehoek CDE liggen vast, en punt D moet op de negatieve y-as liggen.
Als we punt E om te beginnen net links van de negatieve y-as leggen op afstand ef van punt F, en daarna steeds verder naar links bewegen (met behoud van afstand ef), zal punt D omhoog komen en tevens de afstand BC steeds kleiner worden.
We kunnen hiermee dus de hoek ADE bepalen waarbij de afstand tussen B en C precies gelijk is aan de gegeven afstand bc.
Als we dat hebben, dan liggen de coördinaten van alle punten vast.

Dit gebeurt in de functie "getdy(DAFdeg)" in onderstaand programma: afhankelijk van de gegeven hoek DAF (in graden), geeft deze functie de waarde van dy.

Vervolgens roept de functie "mindy()" de functie getdy() herhaaldelijk aan om de kleinste waarde (= meest negatieve waarde) van dy te vinden voor alle relevante hoeken DAF.
Als we de hoek DAF hebben die de kleinste dy oplevert, weten we ook van alle punten de bijbehorende coördinaten, en is je probleem opgelost.

Pari/GP code (waarschijnlijk kan je dit redelijk eenvoudig lezen en omzetten naar jouw favoriete taal):

Code: Alles selecteren
\\ definieer de globale variabelen (= gegeven waarden):

af=6.0;
ab=7.0;
fb=5.2;

cd=5.0;
de=9.8;
ec=10.5;

bc=11.0;
ef=8.0;


\\ definieer:
\\   A = (0, 0)
\\   D = (0, dy)
\\ bereken de waarde van dy, gegeven hoek DAF (in graden):
getdy(DAFdeg)={

\\ dit programma rekent in radialen:
DAF=(Pi/180.0)*DAFdeg;

\\ bereken hoek FAB via de cosinusregel:
FAB=acos((af^2+ab^2-fb^2)/(2.0*af*ab));

\\ gegeven: A = (0,0)
\\ bereken F = (fx,fy) en B = (bx,by):
fx=-af*sin(DAF);
fy=-af*cos(DAF);
BAD=FAB-DAF;
bx=ab*sin(BAD);
by=-ab*cos(BAD);

\\ bereken hoek CDE via de cosinusregel:
CDE=acos((cd^2+de^2-ec^2)/(2.0*cd*de));

\\ BEREKEN HOEK ADE, ZODANIG DAT BC DE JUISTE WAARDE KRIJGT:
\\ start met kleine hoek ADE,
\\ bereken afstand van B tot C = bccalc
\\ vergroot hoek ADE totdat bccalc <= bc
ADE=0.001;
bccalc=bc+1;
while(bccalc>bc,
  ADE+=0.001;
  ex=-de*sin(ADE);
  \\ hef is hoogteverschil tussen punt F en punt E:
  hef=sqrt(ef^2-(ex-fx)^2);
  ey=fy-hef;
  dy=ey-de*cos(ADE);
  cx=cd*sin(CDE-ADE);
  cy=dy+cd*cos(CDE-ADE);
  bccalc=sqrt((cx-bx)^2 + (cy-by)^2);
  );

\\ de optimale hoek ADE moet nu liggen tussen ADEmin en ADEmax:
ADEmax=ADE;
ADEmin=ADE-0.001;

\\ halveer het interval [ADEmin, ADEmax] een groot aantal keer:
\\ (elke 10 halveringen leveren ongeveer 3 extra significante cijfers)
for(i=0,100,
  ADE=(ADEmax+ADEmin)/2.0;
  ex=-de*sin(ADE);
  hef=sqrt(ef^2-(ex-fx)^2);
  ey=fy-hef;
  dy=ey-de*cos(ADE);
  cx=cd*sin(CDE-ADE);
  cy=dy+cd*cos(CDE-ADE);
  bccalc=sqrt((cx-bx)^2 + (cy-by)^2);
  if(bccalc>bc,
    ADEmin=ADE;
    , \\ELSE:
    ADEmax=ADE;
    );
  );

\\ RETURN: de gevonden waarde van dy:
dy
}


\\ D = (0, dy)
\\ bereken minimale dy:
mindy()={
\\ a[] en t[] zijn hoeken in graden = DAFdeg,
\\ fa[] en ft[] de bijbehorende functiewaarden dy
a=vector(3);
fa=vector(3);
t=vector(2);
ft=vector(2);

\\ stapgrootte:
da=0.1;

\\ startwaarden a[1], a[2] en a[3]:
a[1]=da;
a[2]=a[1]+da;
a[3]=a[2]+da;
for(i=1,3,
  fa[i]=getdy(a[i]);
  );

\\ schuif a[] op zolang fa[3] kleiner wordt dan fa[2]:
while(fa[3]<fa[2],
  for(i=1,2,
    a[i]=a[i+1];
    fa[i]=fa[i+1];
    );
  a[3]=a[2]+da;
  fa[3]=getdy(a[3]);
  );
\\ nu is fa[1]>fa[2] en fa[3]>fa[2]
\\ dus fa[2] is de kleinste = minimale dy

\\ halveer het interval [a[1], a[3]] een groot aantal keer:
\\ (zodanig dat fa[2] de kleinste blijft)
for(k=0,100,
  t[1]=(a[1]+a[2])/2.0;
  ft[1]=getdy(t[1]);
  if(ft[1]<fa[2],
    a[3]=a[2];
    a[2]=t[1];
    fa[3]=fa[2];
    fa[2]=ft[1];
    , \\ ELSE:
    t[2]=(a[2]+a[3])/2.0;
    ft[2]=getdy(t[2]);
    if(ft[2]<fa[2],
      a[1]=a[2];
      a[2]=t[2];
      fa[1]=fa[2];
      fa[2]=ft[2];
      , \\ ELSE:
      a[1]=t[1];
      a[3]=t[2];
      fa[1]=ft[1];
      fa[3]=ft[2];
      );
    );
  );

\\ RETURN: de kleinste waarde van dy:
fa[2]
}

\\ MAIN PROGRAM:
{
\\ bereken kleinst mogelijke dy-coordinaat:
mindy();
\\ herbereken alle variabelen voor de minimale hoek:
getdy(a[2]);
\\ toon resultaten:
print("hoek CDE = ",CDE*180.0/Pi," graden");
print("hoek FAB = ",FAB*180.0/Pi," graden");
print("hoek DAF = ",a[2]," graden");
print("bx = ", bx);
print("by = ", by);
print("fx = ", fx);
print("fy = ", fy);
print("cx = ", cx);
print("cy = ", cy);
print("ex = ", ex);
print("ey = ", ey);
print("dy = ", dy);
dy
}

Met als output:

Code: Alles selecteren
hoek CDE = 83.67880219346096023095725617 graden
hoek FAB = 46.36989113214569327191088389 graden
hoek DAF = 30.63625478419053251855075353 graden
bx = 1.898158933736366336742571998
by = -6.737729043400069886069542140
fx = -3.057515769234952498041764207
fy = -5.162518505621030381962945353
cx = 3.784522283525569539373572199
cy = -17.57477814878720272542536271
ex = -5.548912656794383013785105346
ey = -12.76468540385861000789495315
dy = -20.84240589464480096737835516


Kom je hiermee verder?
arie
Moderator
Moderator
 
Berichten: 2918
Geregistreerd: 09 Mei 2008, 09:19


Terug naar Praktijkproblemen

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast

Wie is er online?

Er is in totaal 1 gebruiker online :: 0 geregistreerd, 0 verborgen en 1 gast (Gebaseerd op de gebruikers die actief waren gedurende 5 minuten)
De meeste gebruikers ooit tegelijkertijd online was 649 op 31 Okt 2014, 18:45

Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast
Copyright © 2009 Afterburner - Free GPL Template. All Rights Reserved.