[PHP] snijpunten 2 parabolen bepalen

Pagina: 1
Acties:
  • 516 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • riotrick
  • Registratie: Mei 2002
  • Laatst online: 08-07 18:48
Ik probeer de snijpunten van 2 parabolen in een php scriptje te bepalen. Wiskundig gezien weet ik hoe het werkt, maar het idee naar php vertalen wil nog niet zo lukken. Hieronder even een voorbeeldje hoe het wiskundig werkt:

twee voorbeeld functies:

f(x) = 1.5x^2 - 9x + 11.5
g(x) = -0.2x^2 - 0.4x + 2.8

de twee functies aan elkaar gelijk stellen:

1.5x2 - 9x + 11.5 = -0.2x2 - 0.4x + 2.8

vervolgens stel je een van de zijden op nul:

-9x +11.5 = -1.7x^2 - 0.4x + 2.8
11.5 = -1.7x^2 + 8.6x + 2.8
0 = -1.7x^2 + 8.6x - 8.7

Nu heb je als het ware een nieuwe functie gekregen:

h(x) = -1.7x^2 + 8.6x - 8.7

Waar deze functie 0 als uitkomst heeft liggen de x-waardes van de snijpunten van de oorspronkelijke functie. Dit bepaal je door middel van de abc-formule:

( -b +/- sqrt( b^2 - (4 *a * c) ) ) / 2a

Hiermee heb je dus de x-waardes van de snijpunten uitgerekend. Vul deze in in een van de 2 oorspronkelijke functies en je hebt de y-waardes erbij.

Het uiterekenen van de abc formules en de x-waardes weer in vullen, dat lukt wel :) Het probleem zit em in het eerste gedeelte (2 formules aan elkaar gelijk stellen en 1 zijde op 0 stellen). Hoe kan je dat in een php scriptje oplossen?

[ Voor 3% gewijzigd door riotrick op 01-12-2003 14:55 ]

Facebook :: Twitter :: PSN


Acties:
  • 0 Henk 'm!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 29-08 20:29
Een vergelijking oplossen wordt met PHP (en met andere talen ook overigens) wat moeilijk denk ik... kun je niet beter het snijpunt benaderen oid? Daar zijn volgens mij ook een hoop methoden voor :)

Acties:
  • 0 Henk 'm!

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Zijn het altijd tweedegraads functies (polynomen)? In dat geval kan je gewoon de coefficienten van elkaar aftrekken natuurlijk.

Acties:
  • 0 Henk 'm!

  • riotrick
  • Registratie: Mei 2002
  • Laatst online: 08-07 18:48
het gaat inderdaad altijd om 2e graads polynomen (parabolen). Nu je het zo simpel stelt, denk ik tja, je hebt gelijk orphix :) Ga dat eens implementeren, dan moet het goedkomen lijkt me.

Facebook :: Twitter :: PSN


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Als het enkel om tweedegraads vergelijkingen gaat kun je heel eenvoudig zelf een parsertje schrijven die de a, b en c (uit de abc- of wortelformule) uit de vergelijking haalt, het verschil van allen berekent en invult in de wortelformule. Dit zou je met een eenvoudige preg_replace nog kunnen doen.

Maar 't is natuurlijk leuker om een solver te schrijven die meteen ook hogeregraads vergelijkingen aankan ;) Maar dat is wel een tikkie lastiger. Googlen op "solving equations c++" e.d. brengt je wel op algoritmes daarvoor.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • riotrick
  • Registratie: Mei 2002
  • Laatst online: 08-07 18:48
de a, b en c coefficienten heb ik al in losse variabelen staan. Die worden nl dmv van de kleinste kwadraten methode uit een set meetwaardes berekend.

Facebook :: Twitter :: PSN


Acties:
  • 0 Henk 'm!

  • bille
  • Registratie: Mei 2000
  • Laatst online: 16-08 14:37

bille

Don't call me Buff

lijkt me wel te kunnen. Je zult dmv if statements moeten bepalen wat het format is van de formules en het gelijk stellen aan 0 is ook wel mogelijk.
je weet:
a1x^2+b1x+c1 = -a2x^2+b2x+c2
wordt:
(a1 + a2)x^2 ...... =0

tenminste.. dat leidt ik af uit je topicstart.. Het probleem lijkt me het bepalen van het format van de formules. Dat kan je echter oplossen door regexpressies.

Ultra Pilammo 6666Mhz AMD, 4251Mbit/s RAM, Gefors V6666 MegaTurbo, 43" TFS, Ultra 80Gig Firewire netwerkkaart en 5D geluid met 66 speakers in 5 dimensies


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

bille:
lijkt me wel te kunnen. Je zult dmv if statements moeten bepalen wat het format is van de formules en het gelijk stellen aan 0 is ook wel mogelijk.
je weet:
a1x^2+b1x+c1 = -a2x^2+b2x+c2
wordt:
(a1 + a2)x^2 ...... =0
Nee, dat is een klassieke fout die heel veel gemaakt wordt in de wiskunde. Aan de rechterkant staat dan dus niet -a maar gewoon a. Dat a zelf negatief is, is niet relevant, omdat (a1 - a2) geldt voor elke waarde van a1 en a2 in |R.

Dus je kunt algemeen gewoon stellen, dat de snijpunten van 2 parabolen in de vergelijking
a1x2 + b1x + c1 = a2x2 + b2x + c2

liggen op
Afbeeldingslocatie: http://gerard.yoursite.nl/img/abc.gif

Let wel op dat de discriminant (het gedeelte onder de wortel) > 0 moet zijn. Anders gaan we met complexe getallen werken en dat lijkt me niet de bedoeling ;)
Het probleem lijkt me het bepalen van het format van de formules. Dat kan je echter oplossen door regexpressies.
Je hebt pas een probleem als er met breuken, haakjes en wortels gesmeten gaat worden. Dan kom je er niet onderuit een parser te genereren of te schrijven. Als het alleen maar floating point getallen zijn kun je het gewoon met regexen oplossen.

edit:
Ik vergeet nog te zeggen dat a1 != a2 (hoewel dat opzich natuurlijk wel duidelijk moet zijn door die 2(a1 - a2) onder de deelstreep)

[ Voor 8% gewijzigd door drm op 01-12-2003 15:40 ]

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • trogdor
  • Registratie: Mei 2003
  • Laatst online: 22-04 10:17
ik stel me zo voor dat je een formpje wilt maken waar je de waarden van de 2 functies kan invullen, bijvoorbeeld 3 vakjes per functie (dus een voor a, een voor b en een voor c, om het makkelijk te houden)

noem de textboxen voor f(x) d,e en f
noem de textboxen voor g(x) g,h en i

dan krijg je een functie als volgt: f(x) = d*x^2 + e*x + f
en g(x) = g*x^2 + h*x + i

f(x) = g(x) en je wilt alles aan een kant van de = hebben, dus dan krijg je
f(x)-g(x) = 0 = (d-g)*x^2 + (e-h)*x + (f-i)

correct?

dat kan je in de abc formule of whatever prakken
a = d-g
b = e-h
c = f-i
en dat dan in de abc formule he.

moet lukken.

Acties:
  • 0 Henk 'm!

  • riotrick
  • Registratie: Mei 2002
  • Laatst online: 08-07 18:48
Het gaat niet om een formpje. Ik heb hier een hoop meetwaardes van dakventilatoren. Daar worden grafiekjes van geprint. Op de x-as staat de hoeveelheid luchtverplaatsing, op de y-as staat de tegendruk (veroorzaakt door je kanalensysteem). De ventilatoren worden gementen op een een aantal verschillende drukken. Uit deze meetwaardes wordt na toepassing van de kleinste-kwadraten methode een grafieklijn getekend (het gaat hierbij om een parabool). Vervolgens moet er in de grafiek nog een tweede lijn getekend worden, nl de weerstandslijn. Ook deze lijn is een parabool die altijd start vanuit het nulpunt (0,0) en in een parabool door je luchthoeveelheidslijn loopt. De functie van de de weerstandslijn heeft altijd de vorm P = Constante * Qv^2 (ook een parabool dus). Het werkpunt van de ventilator is ook gemeten (een P en Qv waarde), waarmee je dus de constante kunt bepalen. Nou kun je dus de tweede lijn trekken.
Het probleem zit em echter in meetfouten. Doordat de eerste lijn al ge-curve-fit wordt ligt het werkpunt niet meer precies op de eerste lijn. Nu willen we wel dat de weerstandslijn precies wordt doorgetrokken tot aan de luchthoeveelheidslijn. Vandaar dat ik dus de snijpunten van de 2 ge-curve-fitte lijnen wilde bepalen. Inmiddels is het met de opmerking van Orphix al voor elkaar. Soms kan een oplossing zo simpel zijn dat je er flink overheen loopt te staren :)


/edit:

nog leuker wordt het straks als ik de axiaal-ventilatoren ook ga aanpassen, dat zijn nl. geen parabolen, maar 5e orde polynomen ;)

[ Voor 6% gewijzigd door riotrick op 01-12-2003 15:46 ]

Facebook :: Twitter :: PSN


Acties:
  • 0 Henk 'm!

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 15-05 16:29

Macros

I'm watching...

riotrick schreef op 01 december 2003 @ 15:43:
/edit:

nog leuker wordt het straks als ik de axiaal-ventilatoren ook ga aanpassen, dat zijn nl. geen parabolen, maar 5e orde polynomen ;)
Die zijn leuker, want die kan je niet oplossen met een abs-formule of andere analytische methodes. Dus we mogen verwachten dat je over een weekje of 2 komt met het iteratief oplossen van 5de graads vergelijkingen? ;)

"Beauty is the ultimate defence against complexity." David Gelernter

Pagina: 1