Veeltermen met twee onbekenden

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.
Plaats reactie
Simotion
Vast lid
Vast lid
Berichten: 32
Lid geworden op: 22 dec 2017, 21:46

Veeltermen met twee onbekenden

Bericht door Simotion » 08 mei 2022, 09:53

Omdat mijn vraag uiteindelijk specifiek meer een praktijkprobleem is neem ik het hier over in deze rubriek.
Mijn vraag ging dus over veeltermen met twee onbekenden.
Daarbij kwam ik uiteindelijk op deze twee vergelijkingen met x en y als onbekenden :
ax^2+bx+cy^3+dy^2+ey=f
gx^2+hx+iy^2+jy=0

De basisvraag was om een beweging te maken over een gekende afstand, vertrekkende vanaf stilstand tot stilstand, die binnen een exact bepaalde tijd wordt uitgevoerd (niet sneller of langzamer).
De beweging moet een zogenaamde derde orde motion zijn : eerste afgeleide van afgelegde weg is snelheid, tweede afgeleide is versnellling, derde afgeleide is de 'jerk'. In de formule voor afgelegde weg wordt de jerk vermenigvuldigde met de derde macht van de tijdsbasis.
De formules en de tijdsgrafieken kan je vinden op : https://www.jpe-innovations.com/precisi ... n-profile/
Dus de opdracht was bepaalde afstand afleggen in bepaalde tijd, en verder is enkel opgegeven de 'jerk' die moet gebruikt worden, en ook de procentuele tijd dat de snelheid vanaf stilstand opbouwt tot maximum bereikte snelheid (deze snelheid is niet opgegeven). Het resterende deel van de tijd wordt gebruikt om van maximale snelheid af te bouwen naar stilstand. Er is geen fase van constante snelheid, bij het bereiken van maximale snelheid wordt die onmiddellijk terug afgebouwd.
De jerk die gebruikt wordt moet dezelfde zijn in alle fases. De kleinste deelfases zijn dus :
1) vertrekken vanaf stilstand acceleratie doen toenemen met constante 'jerk' (eerste afgeleide van accelleratie)
2)daarna acceleratie constant houden
3)daarna acceleratie terug naar 0 brengen met constante jerk, maximale snelheid zal op het einde bereikt worden
4)daarna acceleratie in negatieve zin doen toenemen met constante jerk, om sneheid te verminderen
5)daarna negatieve acceleratie constant houden
6)daarna negatieve acceleratie naar 0 brengen met constante jerk tot snelheid 0 wordt en eindpositie bereikt is
De jerk die in dit verloop wordt toegepast is overal dezelfde (in fases 1,3,4,6).
De maximale snelheid die bereikt wordt is vooraf niet opgegeven, hoeft op zich ook niet gekend te zijn in de oplossing
De gebruikte maximum acceleratie (in fase 2) en maximum decceleratie (in fase 5) is wat we dienen te bepalen.
Wat we vooraf weten zijn de totale afstand, de totale tijd en de tijd die aan de acceleratiefase (fase 1+2+3) wordt besteedt en de tijd die aan de deceleratiefase (fase 4+5+6) wordt besteedt (accceleratietijd opgegeven als procent van totale tijd).
Ik heb de formule voor de totale afgelegde weg zoals die in het document waarnaar verwezen wordt uitgewerkt waarbij de totale afstand een functie is van de tijden waarin de acceleratie wordt opgebouwd en afgebouwd (fase 1 en 3) en de decceleratie wordt opgebouwd en afgebouwd (fase 4 en 6). Merk daarbij op dat opbouw en afbouw van de acceleratie even lang zullen duren want de 'jerk' is dezelfde, en de opbouw en afbouw van de deceleratiefase duren ook even lang vanwege diezelfde jerk. Tussen acceleratie en decceleratie op-afbouw is er wel een verschil als de maximale acceleratie verschillend is van de maximale decceleratie. Zo kwam ik tot mijn formule :ax^2+bx+cy^3+dy^2+ey=f
Hierbij is x de tijd voor acceleratie opbouw (= acceleratie afbouw) en y de tijd voor decceleratie opbouw (= decceleratie afbouw). f is de totale afgelegde weg, constanten a t.e.m. e zullen vooraf in de controller berekend worden op basis van opgegeven parameters als jerk voor acceleratie en deceleratie enz. Als ik de tijd ken voor acceleratiepbouw en de jerk is gegeven dan ken ik ook de maximale acceleratie die zal bereikt worden : acceleratie = jerk x tijd, analoog voor deceleratie.
Een andere stelling die je kan nemen is de snelheid die bereikt wordt op het einde van de acceleratiefase = snelheid begin decceleratiefase. Daarvoor kwam ik tot volgende vergelijking : gx^2+hx+iy^2+jy=0
x en y hebben hier dezelfde betekenis als in de eerste vergelijking.
Je zou ook nog kunnen stellen dat de tijd voor acceleratieopbouw (fase 1) maximaal gelijk kan zijn aan de helft van de totale acceleratiefase (fase 1+2+3), omdat fase 1 en 3 even lang duren en moeten afgerond zijn in de totale acceleratiefase. Analoog voor de opbouw van de decceleratie.
Dan kom ik uit op deze twee vergelijkingen met twee onbekenden, maar zie niet onmiddellijk hoe ik kom tot een uitgerekende waarde voor x en y.

arie
Moderator
Moderator
Berichten: 3911
Lid geworden op: 09 mei 2008, 09:19

Re: Veeltermen met twee onbekenden

Bericht door arie » 08 mei 2022, 14:21

Ik ga uit van deze 2 vergelijkingen (f aan de linker kant zoals in je vorige post):
[1] ax^2+bx+cy^3+dy^2+ey+f=0
[2] gx^2+hx+iy^2+jy=0

Bekijk [2] als tweedegraadsvergelijking in y:
\( iy^2+jy+(gx^2+hx)=0\)
dan is
\(y = -\frac{j}{2i}\pm \sqrt{-\frac{g}{i}x^2 - \frac{h}{i}x+\left(\frac{j}{2i}\right)^2}\)
definieer
\(p=-\frac{j}{2i}\)
\(k=-\frac{g}{i}\)
\(m=- \frac{h}{i}\)
\(n=\left(\frac{j}{2i}\right)^2 = p^2\)
dan krijgen we
\(y = p \pm \sqrt{kx^2+mx+n}\)
of nog korter met de veelterm onder de wortel =
\(W = kx^2+mx+n\):
\(y = p \pm \sqrt{W}\)
waarbij we voor reele oplossingen de eis hebben dat \(W \ge 0\)

Substitueer dit resultaat in [1]:
\(ax^2+bx+c(p \pm \sqrt{W})^3+d(p \pm \sqrt{W})^2+e(p \pm \sqrt{W})+f = 0\)
Merk op dat alle \(\pm\) tekens gekoppeld zijn: ze zijn ofwel allemaal plus, ofwel allemaal min.
Werk dit uit naar losse termen via
\((p \pm \sqrt{W})^3 = p^3 \pm 3p^2\sqrt{W} + 3pW \pm W\sqrt{W}\)
en
\((p \pm \sqrt{W})^2 = p^2 \pm 2p\sqrt{W} +W\)
en breng alle termen met een wortelteken naar rechts:
\(ax^2+bx+cp^3+3cpW+dp^2+dW+ep+f=\)
\(\;\;\;\;\;= \pm (3cp^2+cW+2dp+e)\sqrt{W}\)

Dit kunnen we herschrijven als
\(qx^2 + rx + s = \pm (tx^2+ux+w)\sqrt{W}\)
waarbij
\(q=a + 3cpk + dk\)
\(r=b + 3cpm + dm\)
\(s=cp^3 + 3cpn + dp^2 + dn + ep + f\)
en
\(t=ck\)
\(u=cm\)
\(w=cn + 3cp^2 + 2dp + e\)

Als we beide kanten kwadrateren ontstaat een zesdegraadsvergelijking in x:
\(Ax^6+Bx^5+Cx^4+Dx^3+Ex^2+Fx+G=0\)
met
\(A=kt^2\)
\(B=mt^2 + 2ktu\)
\(C=nt^2 + 2mut + 2kwt + ku^2 - q^2\)
\(D=2nut + 2mwt + mu^2 + 2kwu - 2rq\)
\(E=2nwt + nu^2 + 2mwu + kw^2 -2sq - r^2\)
\(F=2nwu + mw^2 - 2sr\)
\(G=nw^2 - s^2\)

Dan moeten we hiervan de nulpunten zoeken. Dat kan vrij eenvoudig met de bisectiemethode, zie bv
https://en.wikipedia.org/wiki/Bisection_method

Vervolgens moeten we bij de gevonden x de oplossingen voor y bepalen:
\(y_1 = p - \sqrt{kx^2+mx+n}\)
\(y_2 = p + \sqrt{kx^2+mx+n}\)

Tenslotte moeten we de oplossingen testen in de 2 oorspronkelijke vergelijkingen:
als \((x, y_1)\) beide vergelijkingen (nagenoeg) gelijk maakt aan nul, dan is \((x, y_1)\) een oplossing
als \((x, y_2)\) beide vergelijkingen (nagenoeg) gelijk maakt aan nul, dan is \((x, y_2)\) een oplossing


Hier nog wat code waar je mogelijk iets aan hebt:

Code: Selecteer alles

veelterm6(x) = A*x^6 + B*x^5 + C*x^4 + D*x^3 + E*x^2 + F*x + G;

func1(x,y)=a*x^2+b*x+c*y^3+d*y^2+e*y+f;

func2(x,y)=g*x^2+h*x+i*y^2+j*y;

\\MAIN:
{
\\ input:
a=1;
b=0.5;
c=0.1;
d=1.8;
e=2;
f=-6;

g=1;
h=0.3;
i=-0.9;
j=-3;
\\ -------------------------------

\\ ter controle: 1 van de oplossingen:

x4=21.90306255046890719394649459215225101993;
y4=-24.9717702530510156794312777461731557846;

\\ --------------------------------

p=-j/(2*i);
k=-g/i;
m=-h/i;
n=p^2;

W=k*x4^2 + m*x4 + n;

q=a + 3*c*p*k + d*k;
r=b + 3*c*p*m + d*m;
s=c*p^3 + 3*c*p*n + d*p^2 + d*n + e*p + f;

t=c*k;
u=c*m;
w=c*n + 3*c*p^2 + 2*d*p + e;

A=k*t^2;
B=m*t^2 + 2*k*t*u;
C=n*t^2 + 2*m*u*t + 2*k*w*t + k*u^2 - q^2;
D=2*n*u*t + 2*m*w*t + m*u^2 + 2*k*w*u - 2*r*q;
E=2*n*w*t + n*u^2 + 2*m*w*u + k*w^2  -2*s*q - r^2;
F=2*n*w*u + m*w^2 - 2*s*r;
G=n*w^2 - s^2;

\\ test of x4 echt een nulpunt is van de veelterm:
print("veelterm6(x4) = ",veelterm6(x4));

\\ zoek het nulpunt voor x in interval [15, 25], dit moet gelijk zijn aan x4:
nulpunt=solve(x=15,25,veelterm6(x));
print("nulpunt = ", nulpunt);
print("x4      = ", x4);

\\ zoek de bijbehorende y-waarde(n):
y41 = p - sqrt(W);
y42 = p + sqrt(W);

\\ test of de gevonden (x, y) paren beide uitgangsvergelijkingen op nul zetten:
print();
print(func1(x4,y41));
print(func2(x4,y41));
print("y41 = ", y41);
print();
print(func1(x4,y42));
print(func2(x4,y42));
print("y42 = ", y42);
}

arie
Moderator
Moderator
Berichten: 3911
Lid geworden op: 09 mei 2008, 09:19

Re: Veeltermen met twee onbekenden

Bericht door arie » 08 mei 2022, 19:33

Het kan eenvoudiger:

Gegeven (met getalvoorbeeld):
s = totale afstand = 480
j = constante jerk = 2
T = totale tijd = 24

Er zijn 4 even lang durende delen t1 met jerk, en 2 even lang durende delen t2 zonder jerk
Dus
T = 4*t1 + 2*t2

Wegens symmetrie van de beweging hoeven we alleen naar de eerste 3 delen te kijken:
na 3 delen hebben we precies s/2 afstand afgelegd.

Voor a, v en x geldt aan het eind van de eerste 3 periodes:

j=2.0;
a1=j*t1;
v1=0.5*j*t1^2;
x1=(1.0/6.0)*j*t1^3;

j=0.0;
a2=a1;
v2=a1*t2+v1;
x2=0.5*a1*t2^2 + v1*t2 + x1;

j=2.0;
a3 = a1 - j*t1 = 0;
v3 = -0.5*j*t1^2 + a1*t1 + v2;
x3 = -(1.0/6.0)*j*t1^3 + 0.5*a1*t1^2 + v2*t1 + x2;

herschrijf x3 in termen met alleen j, t1 en t2:
x3 = j*t1^3 + 1.5*j*t1^2*t2 + 0.5*j*t1*t2^2 = s/2
ofwel:
s/j = 2*t1^3 + 3*t1^2*t2 + t1*t2^2

Substitueer hierin nu
t2 = T/2 -2*t1
(wegens T = 4*t1 + 2*t2 wat we hierboven al gevonden hadden)
en we krijgen:

0.5*T*t1^2 - 0.25*T^2*t1 + s/j = 0

Met s, j en T als bovenstaande voorbeeldgetallen kunnen we dit oplossen met de abc-formule:
t1 = 2 => t2 = 24/2 - 2*2 = 8
of
t1 = 10 => t2 = 24/2 - 2*10 = -8
en deze laatste oplossing vervalt: t2 kan niet negatief zijn.

Conclusie: in bovenstaand voorbeeld is t1 = 2 en t2 = 8.
En hiermee zijn alle overige waarden te bepalen.

Simotion
Vast lid
Vast lid
Berichten: 32
Lid geworden op: 22 dec 2017, 21:46

Re: Veeltermen met twee onbekenden

Bericht door Simotion » 08 mei 2022, 20:53

Arie,
Dit zou inderdaad een veel makkelijkere oplossing kunnen zijn, maar de beweging is niet noodzakelijk symmetrisch.
In de opgave stond dat het procentuele deel van de totale bewegingstijd die gebruikt wordt om te accelereren (van stilstand naar maximaal bereikte snelheid) kan ingesteld worden. Zo kan de acceleratie bv. 60% van de tijd in beslag nemen, waar er dan maar 40% van de opgegeven tijd meer rest om terug tot stilstand te komen.
De jerks zijn wel overal hetzelfde, maar doordat de decceleratie anders kan zijn dan de acceleratie kan ook de tijd waarbij er jerk optreedt tijdens decceleratie anders zijn dan die bij acceleratie.
Wel zal t1=t3 en t4=t6. Bij een niet-symmetrisch profiel zijn t1 of t3 verschillend van t4 of t6.
Het niet-symmetrisch zijn is wellicht net de moeilijkheidsgraad.

arie
Moderator
Moderator
Berichten: 3911
Lid geworden op: 09 mei 2008, 09:19

Re: Veeltermen met twee onbekenden

Bericht door arie » 08 mei 2022, 22:35

Dan is in analogie met eerder bij gegeven T en verhouding:
2*t1 + t2 = 0.6*T = Ta
2*t3 + t4 = 0.4*T = Tb
waarbij Ta = de tijd voor de versnelling en Tb = de tijd voor de vertraging.
In Ta wordt afstand sa afgelegd, in tijd Tb afstand sb, met sa + sb = s, met s vooraf gegeven.

Dit levert stelsel [1]:
Ta*t1^2 - Ta^2*t1 + 2*sa/j = 0
en
Tb*t3^2 - Tb^2*t3 + 2*sb/j = 0

Verder moet de opgebouwde snelheid in het eerste deel:
v3 = j*t1^2 + j*t1*t2
precies worden afgebouwd naar nul in het tweede deel:
v3' = j*t3^2 + j*t3*t4
dus moet
j*t1^2 + j*t1*t2 = j*t3^2 + j*t3*t4
ofwel
t1^2 + t1*t2 = t3^2 + t3*t4
wegens
t2 = Ta - 2*t1
t4 = Tb - 2*t3
geeft dit:
t1^2 - Ta*t1 = t3^2 - Tb*t3
Noem deze uitdrukkingen Q:
Q = t1^2 - Ta*t1 = t3^2 - Tb*t3

Gebruik dit in stelsel [1]:
Ta*(t1^2 - Ta*t1) + 2*sa/j = 0
Tb*(t3^2 - Tb*t3) + 2*sb/j = 0
wordt dan:
Ta*Q + 2*sa/j = 0
Tb*Q + 2*sb/j = 0
en tel deze op:
(Ta+Tb)*Q + 2*(sa+sb)/j = 0
ofwel
T*Q + 2*s/j = 0
ofwel
Q = -2*s/(j*T)
waarmee we t1 en t3 kunnen bepalen:
t1^2 - Ta*t1 = -2*s/(j*T)
en
t3^2 - Tb*t3 = -2*s/(j*T)

Vervolgens kunnen we ook t2, t4 en de rest van alle onbekenden bepalen.

arie
Moderator
Moderator
Berichten: 3911
Lid geworden op: 09 mei 2008, 09:19

Re: Veeltermen met twee onbekenden

Bericht door arie » 09 mei 2022, 08:40

Rekenvoorbeeld:

Gegeven:
T = 24
Ta = 0.6*T = 14.4
Tb = T - Ta = 9.6
s = 480
j = 2

Uitwerking:

We hebben nu 4 verschillende tijdsintervallen, verdeeld over de totale beweging: t1-t2-t1-t3-t4-t3

Q = -2*s/(j*T) = -20.00

Oplossen: t1^2 - Ta*t1 - Q = 0:
geeft als enige bruikbare oplossing
t1 = 1.5573056081336462299071345236490694088
t2 = Ta - 2*t1 = 11.285388783732707540185730952701861182
(de andere t1>12 en maakt t2 negatief, dit kan niet)

Oplossen: t3^2 - Tb*t3 - Q = 0:
geeft als enige bruikbare oplossing
t3 = 3.0564404225837305791052072064561537364
t4 = Tb - 2*t3 = 3.4871191548325388417895855870876925272

Berekening bewegingsparameters deel 1: versnellen (t1-t2-t1):
j=2.0;
a1=j*t1;
v1=0.5*j*t1^2;
x1=(1.0/6.0)*j*t1^3;

j=0.0;
a2=a1;
v2=a1*t2+v1;
x2=0.5*a1*t2^2 + v1*t2 + x1;

j=2.0;
a3 = a1 - j*t1;
v31 = -0.5*j*t1^2 + a1*t1 + v2;
x31 = -(1.0/6.0)*j*t1^3 + 0.5*a1*t1^2 + v2*t1 + x2;

levert:
v31 = 40.00
x31 = 288.00

Berekening bewegingsparameters deel 2: vertragen (t3-t4-t3):
(wegens symmetrie hergebruik ik hiervoor de versnellingsformules van deel 1):
j=2.0;
a1=j*t3;
v1=0.5*j*t3^2;
x1=(1.0/6.0)*j*t3^3;

j=0.0;
a2=a1;
v2=a1*t4+v1;
x2=0.5*a1*t4^2 + v1*t4 + x1;

j=2.0;
a3 = a1 - j*t3;
v32 = -0.5*j*t3^2 + a1*t3 + v2;
x32 = -(1.0/6.0)*j*t3^3 + 0.5*a1*t3^2 + v2*t3 + x2;

levert:
v32 = 40.00
x32 = 192.00

De maximale snelheid (40.00) opgebouwd in deel 1 wordt dus volledig teruggebracht tot nul in deel 2
De totale afstand = x31 + x32 = 288 + 192 = 480 = s

Simotion
Vast lid
Vast lid
Berichten: 32
Lid geworden op: 22 dec 2017, 21:46

Re: Veeltermen met twee onbekenden

Bericht door Simotion » 09 mei 2022, 19:24

Ik heb ondertussen de oplossing geïmplementeerd in de controller en het werkt volledig.
Bedankt om deze eenvoudige implementatie voor een schijnbaar niet zo eenvoudig probleem aan te reiken.

Plaats reactie