Programarea unei ecuații algebra

voturi
2

într - un alt post, MSN mi -a dat un bun ghid pe rezolvarea problemei mele algebra ( calcularea prețului sumei licitate din costul total ). Acum, chiar dacă eu pot calcula de mână, sunt complet blocat cu privire la modul de a scrie acest lucru în pseudocod sau cod. Oricine putea sa- mi dea un indiciu rapid? Apropo, vreau să calculeze suma licitată , având în vedere costurile finale.

usage cost(bid) = PIN(bid*0.10, 10, 50)
seller cost(bid) = bid*.02
added cost(bid) = PIN(ceiling(bid/500)*5, 5, 10) + PIN(ceiling((bid - 1000)/2000)*5, 0, 10)
storing cost(bid) = 100
So the final cost is something like:

final cost(bid) = PIN(bid*.1, 10, 50) + pin(ceiling(bid/500)*5, 5, 20) + PIN(ceiling((bid - 1000)/2000)*10, 0, 20) + bid*.02 + 100 + bid
Solve for a particular value and you're done.

For example, if you want the total cost to be $2000:

2000 = PIN(bid*.1, 10, 50) + pin(ceiling(bid/500)*5, 5, 10) + PIN(ceiling((bid - 1000)/2000)*5, 0, 10) + bid*.02 + 100 + bid.
Bid must be at least > 1500 and < 2000, which works out nicely since we can make those PIN sections constant:

2000 = 50 + 10 + 5 + 100 + bid*1.02
1835 = bid*1.02
bid = 1799.0196078431372549019607843137
Întrebat 13/03/2009 la 02:08
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
2

Datorită utilizării PINși ceiling, eu nu văd o modalitate ușoară de a inversa calcul. Presupunând că bidare o precizie fixă (mi - ar ghici două zecimale , în spatele punctului) , puteți folosi întotdeauna o căutare binară (ca funcțiile sunt monotone).

Edit: Dupa ce sa gandit la asta ceva mai mult, am observat că, luând x = bid*1.02 + 100, avem că costurile finale sunt între x + 15 (exclusiv) și x + 70 (inclusiv) ( de exemplu x+15 < final cost < x+70). Având în vedere dimensiunea acestui interval ( 70-15=55) , precum și faptul că valorile speciale (vezi nota de mai jos) pentru bidtoate sunt în afară mai mult decât acest lucru, puteți lua x+15 = final costși x+70 = final cost, obține dreptul de cazuri / valorile de utilizare și a costurilor adăugate și pur și simplu rezolva această ecuație ( care nu mai are fie PINsau ceilingîn ea).

Pentru a ilustra, lasa costul final să fie 222. Din x+15 = 222aceasta rezultă că bid = 107/1.02 = 104.90. Apoi avem că costurile de utilizare sunt date de bid*0.1și că costurile suplimentare sunt 5. Cu alte cuvinte, vom obține final cost = bid*0.1 + bid*0.02 + 5 + 100 + bid = bid*1.12 + 105și , prin urmare bid = (222-105)/1.12 = 104.46. Deoarece această valoare a bidmijloacelor au fost luate valorile corecte pentru utilizare și costuri suplimentare, noi știm că aceasta este soluția.

Cu toate acestea, dacă ne - ar fi uitat la primul x+70 = 222, vom obține următoarele. În primul rând vom obține că pentru această presupunere că bid = 52/1.02 = 50.98. Acest lucru înseamnă că costurile de utilizare sunt 10și costurile suplimentare sunt 5. Așa că vom obține final costs = 10 + bid*0.02 + 5 + 100 + bid = bid*1.02 + 115și , prin urmare bid = (222-115)/1.02 = 104.90. Dar dacă bideste , 104.90atunci costurile de utilizare nu sunt 10însă bid*0.1, astfel încât aceasta nu este soluția corectă.

Sper că am explicat suficient de clar. Dacă nu, vă rugăm să-mi spuneți.

NB: Cu valori speciale înțeleg acei oameni pentru care funcția de definire a valorilor de utilizare și a costurilor adăugate schimba. De exemplu, pentru costul de utilizare a acestor valori sunt 100și 500: mai jos 100utilizați 10, de mai sus 500utilizați 50și între utilizați bid*0.1.

Publicat 13/03/2009 la 02:47
sursa de către utilizator

voturi
3

Funcția simplifică la:

                  / 1.02 * bid + 115   bid <   100
                  | 1.12 * bid + 105   bid <=  500
final cost(bid) = | 1.02 * bid + 160   bid <= 1000
                  | 1.02 * bid + 165   bid <= 3000
                  \ 1.02 * bid + 170   otherwise

Dacă considerați că fiecare piesă ca o funcție separată, ele pot fi inversat:

bid_a(cost) = (cost - 115) / 1.02
bid_b(cost) = (cost - 105) / 1.12
bid_c(cost) = (cost - 160) / 1.02
bid_d(cost) = (cost - 165) / 1.02
bid_e(cost) = (cost - 170) / 1.02

Dacă vă conectați costul în fiecare funcție obține o valoare licitată estimată pentru acel interval. Trebuie să verificați dacă această valoare într-adevăr, este în acest interval valid funcționează.

Exemplu:

cost = 2000

bid_a(2000) = (2000 - 115) / 1.02 = 1848  Too big! Need to be < 100
bid_b(2000) = (2000 - 105) / 1.12 = 1692  Too big! Need to be <= 500
bid_c(2000) = (2000 - 160) / 1.02 = 1804  Too big! Need to be <= 1000
bid_d(2000) = (2000 - 165) / 1.02 = 1799  Good. It is <= 3000
bid_e(2000) = (2000 - 170) / 1.02 = 1794  Too small! Need to be > 3000

Just to check:

final cost(1799) = 1.02 * 1799 + 165 = 2000   Good!

Deoarece funcția inițială este strict în creștere, cel mult una dintre aceste funcții va da o valoare acceptabilă. Dar, pentru unele intrări nici unul dintre ei va da o valoare bună. Acest lucru se datorează faptului că funcția inițială sare peste aceste valori.

final cost(1000) = 1.02 * 1000 + 160 = 1180
final cost(1001) = 1.02 * 1001 + 165 = 1186

Deci , nici o funcție va da o valoare acceptabilă pentru , cost = 1182de exemplu.

Publicat 13/03/2009 la 03:32
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more