Programování algebry rovnici

hlasů
2

V jiné místo, MSN mi dal dobrý návod na řešení mého problému algebry ( Výpočet nabídkové ceny z celkových nákladů ). Nyní, i když jsem ji lze vypočítat ručně, jsem úplně přilepená na to, jak psát to v pseudokódu nebo kód. Každý, kdo mi mohl dát rychlý radu? Mimochodem, chci vypočítat nabídku s ohledem na konečné náklady.

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
Položena 13/03/2009 v 02:08
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
2

Vzhledem k použití PINa ceiling, já nevidím snadnou cestu k obrácení výpočtu. Za předpokladu, že bidmá pevnou přesnost (Hádám, že dvě desetinná místa stojí za tečkou), můžete vždy použít binární vyhledávání (protože funkce jsou monotónní).

Edit: Po přemýšlení o tom něco víc, jsem si všiml, že vezmeme x = bid*1.02 + 100, máme, že konečné náklady jsou mezi x + 15 (exkluzivní) a x + 70 (včetně) (tj x+15 < final cost < x+70). Vzhledem k velikosti tohoto rozsahu ( 70-15=55) a ke skutečnosti, že zvláštní hodnoty (viz poznámka níže) pro použití bidjsou od sebe více než to, můžete si vzít x+15 = final costa x+70 = final cost, získat správné případů / hodnoty využití a přidané náklady a jednoduše vyřešit tuto rovnici ( který již nemá buď PINnebo ceilingv něm).

Pro ilustraci, ať konečné náklady být 222. Z x+15 = 222toho vyplývá, že bid = 107/1.02 = 104.90. Pak máme, že náklady na používání jsou dány bid*0.1a že dodatečné náklady 5. Jinými slovy, dostaneme final cost = bid*0.1 + bid*0.02 + 5 + 100 + bid = bid*1.12 + 105a proto bid = (222-105)/1.12 = 104.46. Protože tato hodnota bidprostředků byly pořízeny správné hodnoty pro použití a dodatečné náklady, víme, že to je řešení.

Nicméně, pokud bychom se nejprve podíval na x+70 = 222, dostaneme následující. Za prvé jsme se, že pro tento předpoklad, že bid = 52/1.02 = 50.98. To znamená, že náklady na používání jsou 10i dodatečné náklady 5. Tak dostaneme final costs = 10 + bid*0.02 + 5 + 100 + bid = bid*1.02 + 115a proto bid = (222-115)/1.02 = 104.90. Ale pokud bidje 104.90pak náklady na používání nejsou 10ale bid*0.1tak to není správné řešení.

Doufám, vysvětlil jsem to dost jasně. Pokud ne, prosím dejte mi vědět.

Poznámka: Se speciálními hodnotami myslím ty, pro které je funkce definuje hodnoty využití a dodatečné náklady měnit. Například pro náklady využití jsou tyto hodnoty 100a 500: pod 100použít 10výše 500použít 50i mezi používáte bid*0.1.

Odpovězeno 13/03/2009 v 02:47
zdroj uživatelem

hlasů
3

Funkce zjednoduší na:

                  / 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

Máte-li v úvahu každý kousek jako samostatnou funkci, mohou být převrácený:

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

Pokud připojíte vaše náklady na každou funkci vám předpokládané hodnoty nabídek pro tento rozsah. Je třeba zkontrolovat, zda je tato hodnota ve skutečnosti je v rámci které funguje platný rozsah.

Příklad:

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!

Protože původní funkce je přísně rostoucí, nejvýše jeden z těchto funkcí dá přijatelnou hodnotu. Ale pro některé vstupy se ani jeden z nich dávají dobrou hodnotu. Je to proto, že původní funkce přeskočí těchto hodnot.

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

Takže žádná funkce dá přijatelnou hodnotu cost = 1182např.

Odpovězeno 13/03/2009 v 03:32
zdroj uživatelem

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