mboost-dp1

Formel...


Gå til bund
Gravatar #1 - rackbox
13. okt. 2010 08:27
Jeg har nogle forudsætninger, og skal lave en formel, der beregner en kurve ud fra disse:


Kurven skal mødes i 3 x,y-punkter og skal være glat.

Eksempel:

Hvis x <= 100, er y = 350
Hvis x >= 2000, er y = 55

Sidste punkt er "midten" mellem x=100 og x=2000 - altså i dette tilfælde:

x = 1050 og y = 82

Hvordan kan en ligning se ud, der giver mulighed for at sætte forskellige konstante x og y ind for 3 punkter?
Gravatar #2 - myplacedk
13. okt. 2010 08:38
Altså lidt som en modificeret sinus-kurve:

Starter i minimum, kør over et toppunkt og slut i minimum, og så flytter man start, slut og toppunkt til de 3 kendte punkter?

Eller skal det være en bue (del af en cirkel)?
Gravatar #3 - rackbox
13. okt. 2010 08:44
Kurven kan ligne www.pbtryk.dk/test.jpg

Der er 3 kendte punkter og alt før første punkt er konstant (i dette tilfælde 350) og alt efter sidste punkt er konstant (i dette tilfælde 55)
Gravatar #4 - rackbox
13. okt. 2010 08:47
Ligningen må meget gerne være i stil med

y = .....p1....p2....p3...
Gravatar #5 - myplacedk
13. okt. 2010 11:30
Én vej at gå kunne være Lagrange interpolating.

Du har tre punkter: x1,y1 og x2,y2 osv. De er i dette tilfælde:

100,350
1050,82
2000,55

Formlen er så:
y = ((x-x2)*(x-x3))/((x1-x2)*(x1-x3))*y1 + ((x-x1)*(x-x3))/((x2-x1)*(x2-x3))*y2 + ((x-x1)*(x-x2))/((x3-x1)*(x3-x2))*y3

Hvilket Wolfram Alpha i dette tilfælde forkorter til y = (241 x^2-786350 x+707975000)/1805000
Gravatar #6 - Pally
13. okt. 2010 14:07
Tænk i kvart-cirkler.

Kald første punkt A, sidste punkt B og midten M.

Det simple tilfælde er hvis |Ax - Mx| = |Ay - My|. I så fald kan du forbinde A og M med en kvart-cirkel (simpel formel), og ditto M til B.

Det knap så simple tilfælde kræver at du deformerer til en ellipse istedet. A og M hhv M og B forbindes med kvart-ellipser (osse relativt simple formler).

Kurven vil - så vidt jeg lige kan se - være differentiabel i A,B men ikke i M. M har dog en lodret vendetangent, A og B har vandrette tangenter.
Gravatar #7 - rackbox
13. okt. 2010 15:18
MyPlace-> hvis jeg kører din formel, så forstår jeg det rigtigt, at jeg skal indsætte tallene som følger?

y = ((x-1050)*(x-2000))/((100-1050)*(100-2000))*350 + ((x-100)*(x-2000))/((1050-100)*(1050-2000))*82 + ((x-100)*(x-1050))/((2000-100)*(2000-1050))*55

Resultatet er en parabel og ligner ikke helt den, jeg linker til... Har jeg misforstået noget?
Gravatar #8 - myplacedk
13. okt. 2010 15:44
rackbox (7) skrev:
y = ((x-1050)*(x-2000))/((100-1050)*(100-2000))*350 + ((x-100)*(x-2000))/((1050-100)*(1050-2000))*82 + ((x-100)*(x-1050))/((2000-100)*(2000-1050))*55


Jeg har ikke lige nærlæst det hele, men umiddelbart ser det korrekt ud. Så hvis der er fejl er det nok bare "sjusk".

rackbox (7) skrev:
Resultatet er en parabel og ligner ikke helt den, jeg linker til... Har jeg misforstået noget?

Den ser sådan ud: http://www.wolframalpha.com/input/?i=plot+y+%3D+(2...

Fra x=100 til x=2000 ligner den nu meget godt, ud over at den dykker en anelse mere.

Det er vist mit bedste bud til en "y="-formel.

Alternativt ville jeg gå efter en arc (delcirkel). Der vil altid være netop én arc som går gennem de tre punkter, medmindre de er på en linje. Det er geometrisk simpelt, men jeg skal vist lige tænke mig lidt om for at omsætte det til en algoritme der kan programmeres.

Eller måske en ellipse som Pally foreslår. Jeg kan ikke umiddelbart overskue om det vil være simplere at implementere.
Gravatar #9 - rackbox
13. okt. 2010 19:21
MyPlace-> jeg sætter stor pris på din ihærdighed :D

Den kurve, du har frembragt, går opad inden den når 2000... Det er ikke så heldigt, fordi formlen skal bruges i en prisberegner. y-aksen bliver derfor en faktor, som kostprisen skal ganges med for at få salgsprisen. Hvis den stiger igen efter 2000, så er der ingen sammenhæng mellem mængde og "rabat" - især fordi rabatten bliver mindre, når der købes over 2000 ekspl.

Måske er en arc det rigtige, hvis man klipper kurven før den stiger igen..

Jeg er bare en spasser til formler :(
Gravatar #10 - myplacedk
13. okt. 2010 20:32
Jeg troede den var konstant uden for de tre punkter, men jeg kan godt se at y3 skal være det laveste punkt. Det betyder også at en arc i nogle tilfælde ikke kan bruges.

Så vi kan tilføje disse facts:

1) y1 > y2 > y3 (altså de tre punkter vil være faldende)
2) Kurven skal falde hele vejen. Ingen stigninger.
3) Kurven er flad før x1 og efter x3
4) kurven må gerne (skal?) knække ved x1, men skal (?) flade ud ved x3

Enig? Ret især gerne punkt 4 til.
Gravatar #11 - myplacedk
13. okt. 2010 21:44
Hmm... Måske sådan her:

n = log((y1-y2)/(y1-y3)))/(log((x1-x2)/(x1-x3))
y = (-1*((x-x1)/(x3-x1))^n+1)*(y1-y3)+y3
(Måske kan det forkortes, jeg er ved at være træt.)

Se eksempel med dine egne tal på wolframalpha.com med: plot y = (-1*((x-100)/(2000-100))^0.1384+1)*(350-55)+55 for x=100 to 2000

Så længe de tre punkte er faldende, skulle den formel give en kurve som altid er faldende, og går gennem alle tre punkter. Plus den falder mest i starten, ligesom i din tegning.

(Der skal så tilføjes at værdierne uden for x1-x3 skal være konstante.)
Gravatar #12 - rackbox
15. okt. 2010 15:29
#11 vi nærmer os gevaldigt :) Den fortsætter bare nedad efter 2000... Og jeg kan ikke lige se, hvordan man sætter midtpunktet...

Jeg er utroligt glad for dine forsøg! Bare sig til, hvis jeg er for besværlig.
Gravatar #13 - myplacedk
15. okt. 2010 17:53
#12
Midtpunktet er x2 og y2, som kun angives på første linje. Og ja, den bliver ved med at falde. I eksemplet rammer den nul mellem 6.634 og 6.635.

Formlet er i øvrigt "y=x^n". Den første linje beregner n, alt det ekstra på linje 2 er for at vende, skalere og flytte stregen, så den rammer de tre punkter.

Og jeg synes i øvrigt at matematik er skægt at lege med, så det skal du ikke bekymre dig om. :)
Gravatar #14 - rackbox
16. okt. 2010 20:46
myplacedk (13) skrev:
#12
Og jeg synes i øvrigt at matematik er skægt at lege med, så det skal du ikke bekymre dig om. :)


#13 i så fald må du meget gerne finde en formel med en vandret og en lodret asymptote, hvor jeg på en eller anden måde kan styre hvor "stejl" kurven er...
Gravatar #15 - myplacedk
16. okt. 2010 22:30
Jo mere du snakkede om at du vil bruge samme formel til for x>x3 i stedet for at gøre det til en konstant som du nævnte i starten, jo mere tænkte jeg netop på at lave noget med en vandret asymptote. Men om en lodret asymptote er en god ide ved jeg nu ikke lige. Men vi prøver.

I stedet for at basere det på x^n skal vi nok nærmere have fat i 1/x.

Prøv den her:

y=(1/((x-x1)*n))+y1

x1 = lodret asymptote
y1 = vandret asymptote
n = "skarphed" - større tal, skarpere kurve
Gravatar #16 - myplacedk
16. okt. 2010 23:02
Hmm... Jeg kunne også lægge propel-hatten fra mig et øjeblik og tænke lidt over hvad du faktisk skal bruge det til.

Ofte er prisen en styk-pris (a) plus en fast omkostning (b):
y = ax + b

Det du vil have en kurve på er stk-prisen, så bliver det til:
y = (ax + b)/x
Hvilket er det samme som:
y = a + b/x

Det giver i øvrigt en vandret asymptote ved "a".

Det er den simpleste løsning. Spørgsmålet er så: Hvad er der galt med den løsning? Hvilket problem er det vi løser, ved at gøre det mere avanceret?
Gravatar #17 - BlackFalcon
17. okt. 2010 08:37
Er jeg den eneste der tænker at man kunne vurdere x-værdien inden udregning, og altså bruge simple 3 formler med lidt if-then-else? Den slags kan man jo godt gøre i fx. regneark, men jeg ved jo ikke hvor det skal anvendes.
Gravatar #18 - rackbox
17. okt. 2010 16:20
#16 Jeg forsøger at regne en salgspris ud for et produkt (serviceydelse), hvor det forholdsmæssige arbejde pr. stk. er mindre ved højere antal. Det kunne være print, eksempelvis. Hvis en kunde bestiller 1 stk. print, så bruger jeg måske 10 minutter på opgaven samlet. Hvis kunden bestiller 2000 print, så er tidsforbruget måske kun 30 minutter.

Min beregning skal kunne finde ud af en rimelig salgspris, der automatisk giver "rabatter" i forhold til kvantum.


Problemet med min oprindelige lineære formel er:

salgspris = antal * (kostpris + kostpris * faktor)

faktor = [det umulige problem] * eller / antal

Jeg har forsøgt mig med en simpel lineær kurve, hvor faktoren daler med et fast tempo indtil et minimum. I mit forsøg får jeg altså med en kostpris på 1 (for at holde det let):

100 stk koster: 100 * (1 + 1*3,50) = kr. 450,-
2000 stk koster: 2000 * (1 + 1*0,55) = kr. 3100,-

Det ser fint ud... Men hvad mon 1500 stk koster?

1500 stk, faktor: 3,5-(3,50-0,55)/(2000-100)*(1500-100) = 1,326
1500 stk, pris: 1500*(1 + 1*1,326) = 3489,-

1500 stk. koster altså over 300,- mere end 2000 stk?
Gravatar #19 - rackbox
17. okt. 2010 16:26
MyPlace-> Jeg kan egentlig godt se, hvad du mener med den lodrette asymptote. Måske kan jeg bruge et billigt hack for tal, der er under 100... Jeg prøver din y=(1/((x-x1)*n))+y1 løsning lidt...
Gravatar #20 - myplacedk
17. okt. 2010 20:08
rackbox (18) skrev:
100 stk koster: 100 * [...] = kr. 450,-
2000 stk koster: 2000 * [...] = kr. 3100,-

Hvis jeg laver det til y=ax+b får jeg det til:

a ~= 1,395
b ~= 310,5

Dvs:

100 stk: 100 * 1,395 + 310,5 = 450,00
2000 stk: 2000 * 1,395 + 310,5 = 3.100,50
1500 stk: 1500 * 1,395 + 310,5 = 2.403,00

Altså kort sagt: Et opstartsgebyr på 310,50 og en stykpris på 1,395.

Hvis det skal være en "y="-formel på stykprisen bliver det til:
y = 1,395 + 310,5/x
(Og dermed en vandret asymptote på 1,395 for stykprisen.)
Gravatar #21 - rackbox
18. okt. 2010 06:43
#20 men stk-prisen er ikke så interessant. Det er et marked, hvor kostpriser fluktuerer, og derfor er der behov for at regne en faktor ud.

Opstart kommer oven i hatten. Den har jeg bare ikke nævnt her, fordi det jo egentlig bare er at lægge denne til, når prisen er regnet ud.

y = ax + b er jo også lineær, og tager ikke højde for en stigende rabat pr. stk.

Det essentielle er, at salgsprisen ALDRIG må falde under kostprisen * 1,2

Det er så de 1,2, jeg skal finde en formel for.
Gravatar #22 - myplacedk
18. okt. 2010 08:44
rackbox (21) skrev:
y = ax + b er jo også lineær, og tager ikke højde for en stigende rabat pr. stk.

Jo den gør da. :)

100 stk: 100 * 1,395 + 310,5 = 450,00 (4,5 pr stk)
1500 stk: 1500 * 1,395 + 310,5 = 2.403,00 (ca 1,6 pr stk)
2000 stk: 2000 * 1,395 + 310,5 = 3.100,50 (ca 1,55 pr stk)

Så hvis styk-prisen skal nærme sig 1,2, så kunne prisen være:

100 stk: 100 * 1,2 + 330 = 450,00 (4,5 pr stk)
1500 stk: 1500 * 1,2 + 330 = 2.130,00 (1,42 pr stk)
2000 stk: 2000 * 1,2 + 330 = 2.730,00 (1,365 pr stk)

Så kan du justere de 330 op og ned. Jo større den er, jo højere er prisen for få stk, og jo større betydning for mængderabaten.
Gravatar #23 - Emil Melgaard
18. okt. 2010 11:02
Hvis du gerne vil have en vandret asymptote kan du bruge en (faldende) eksponentialfunktion af formen y = a*e^(-b*x)+c (hvor e er Eulers konstant).

a, b og c kan du selv bestemme for at definere hhv. hvad prisen er for få stk., hvor hurtigt prisen falder mod asymptoten og hvor asymptoten skal ligge.

Hvis jeg bruger dine to første punkter fra #1 (100, 350) og (1050, 82), og definerer at asymptoten skal være 55 får jeg:

y = 379,43*e^(-0,0025170*x) + 55

x = 2000 giver y = 57,47, men til gengæld vil stykprisen blive ved med at falde langsomt uden at du vil komme under en stykpris på 55 uanset hvor meget der bliver købt.

1500 stk. vil have en stykpris på 63,70.

Det giver ikke en lodret asymptote, men det kan jeg heller ikke se hvad du skal bruge til. Enten vil den ligge før x=1 og så er den irrelevant, eller også vil den ligge efter x=1 og så vil det betyde at 1 stk. koster uendeligt meget.
Gravatar #24 - rackbox
18. okt. 2010 13:48
#23 meget interessant kurve - men jeg fatter hat af, hvordan mine punkter omsættes til a, b og c... Hvordan bruger jeg ligningen?

EDIT: Kurven er faktisk nøjagtigt, hvad jeg skal bruge. Nu mangler jeg bare at omsætte mine punkter til a, b og c... Og er det tilfældigt at y=55 ligger tæt på x=2000?
Gravatar #25 - Emil Melgaard
18. okt. 2010 14:52
rackbox (24) skrev:
men jeg fatter hat af, hvordan mine punkter omsættes til a, b og c


c vælger du som den mindste stykpris du er villig til at give, dvs. kostprisen * 1,2 ifølge det du siger i #21.

a og b finder du ved at vælge mindst 2 punkter (x,y) og lave en eksponentiel regression. Hvis du trækker c fra alle dine y-værdier kan du bruge denne metode:

http://mathworld.wolfram.com/LeastSquaresFittingEx...

Ellers kan du bare give mig nogle (x,y) punkter og c, så kan jeg rimelig hurtigt give dig a og b.

rackbox (24) skrev:
Og er det tilfældigt at y=55 ligger tæt på x=2000?


Der er ikke nogen x-værdi der har y=55. Jo højere x er, jo tættere kommer y på 55, men det vil aldrig ramme helt.

F.eks. er f(3000) = 55,20 og f(5000) = 55,0013.
Gravatar #26 - rackbox
18. okt. 2010 17:13
#25 Tak for tilbuddet - men det skal være variabelt og kunne programmeres i PHP :D

Jeg skal lige undersøge, om jeg overhovedet har stillet de korrekte parametre for opgaven, for der er stadigvæk noget, der hænger ved nærmere afprøvning.

Jeg tror at jeg prøver at definere opgaven på ny. Vi sletter tavlen:


* Ved et givent minimumskvantum skal stk-prisen være = kostpris + kostpris*avance_1
* Ved et givent maximumskvantum skal stk-prisen være = kostpris + kostpris*avance_2
*Alt under minimumskvantum skal have samme avance som avance_1
*Alt over maximumskvantum skal have samme avance (eller tilnærmet) som avance_2
* På intet tidspunkt må avance_n (for n=antal) falde med mindre end avance_2 eller mere end avance_1

Hvis f.eks. 1000 stk. koster 1000,- og 1001 stk. koster 1000,90 så er avancen for det sidste print mindre end kostprisen for det sidste print. Og det må ikke kunne ske.

Jeg er R*V-besværlig, det véd jeg, men jeg véd at I elsker en udfordring :D

Det værste ved min opgave er, at jeg sikkert kan løse den selv på en relativt simpel måde, men jeg er åbenbart løbet sur i det.
Gravatar #27 - Emil Melgaard
18. okt. 2010 20:23
#26:

Det kan gøres på mange forskellige måder. Den letteste er at lave en stykvis lineær funktion:

Eksempel

Det er meget nemt at lave i PHP.

Ellers bliver du nødt til at prøve at forklare hvad avance_n skal være mellem avance_1 og avance_2. Kan du evt. tegne en skitse over hvordan du havde forestillet dig at udviklingen mellem avance_1 og avance_2 skulle være? Lidt ligesom du gjorde i #3.
Gravatar #28 - myplacedk
18. okt. 2010 20:28
Jeg skulle nu stadig mene at y=ax+b overholder det.

Hvis kostprisen er 55 og minimumavancen er 20%, er minimumsprisen 66.

Hvis rabatten starter ved 100 stk, hvor pris pr. stk er 132 (avance på 66 ud over de 66 minimum), så får vi:

function beregnStkPris(antal) {
minimumKvantum = 100
minimumPris = 66
avanceVedMinimumKvantum = 66

if (antal < minimumKvantum) {
return minimumPris + avanceVedMinimumKvantum
}

return minimumPris + avanceVedMinimumKvantum*minimumKvantum/antal
}

(Oversæt selv til PHP)
Gravatar #29 - rackbox
19. okt. 2010 14:22
#27 Stykvis lineær = flere lineære segmenter, som til sammen giver en "kantet" kurve?

Det var faktisk mit udgangspunkt, som jeg er ved at arbejde hen imod en ligning med en blød kurve...

Den lineære kurve gør, at jeg får en mærkelig samlet pris på flere steder. Prøv f.eks. at regne en pris ud på 1000, 1500 og 2000 stk.

#28 din funktion ser ud til at lide samme brist - altså at den samlede pris for eks. 1500 stk. er højere end prisen for 2000 stk.
Gravatar #30 - myplacedk
19. okt. 2010 17:20
rackbox (29) skrev:
#28 din funktion ser ud til at lide samme brist - altså at den samlede pris for eks. 1500 stk. er højere end prisen for 2000 stk.

Huh? 105.600 > 138.600 ?
Gravatar #31 - rackbox
23. okt. 2010 11:52
#30 My bad... Jeg har nu fundet frem til en løsning, som lige p.t. holder. Formlen gør brug af x^0.787, hvilket lige giver den hældning, som der er behov for.

Jeg havde dog ikke nået til løsningen uden jeres hjælp :) Tak!
Gravatar #32 - GormDK
27. okt. 2010 16:38
(Ikke at jeg kan være sikker på at forstå det, men) hvad blev løsningen? (Hvis det altså er til at forklare kortfattet) :)
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login