From: flebber Date: 2010-11-10T10:55:14+09:00 Subject: Re: Create a class - ideas On Nov 10, 12:44 pm, flebber wrote: > On Nov 8, 9:40 pm, flebber wrote: > > > On Nov 8, 3:33 am, Mike Cargal wrote: > > > > On Nov 7, 2010, at 12:20 AM, flebber wrote: > > > > > On Nov 7, 12:13 pm, flebber wrote: > > > >> On Nov 7, 11:06 am, Mike Cargal wrote: > > > > >>> On Nov 6, 2010, at 7:00 PM, flebber wrote: > > > > >>>> On Nov 7, 9:45 am, flebber wrote: > > > >>>>> On Nov 7, 2:24 am, Robert Klemme wrote: > > > > >>>>>> On 06.11.2010 10:19, flebber wrote: > > > > >>>>>>> I am trying to create a class. I am struggling to figure the best flow > > > >>>>>>> to get the maths side to work. > > > > >>>>>>> So say that > > > > >>>>>>> R is a float given by user input > > > >>>>>>> P is a Total amount(Pool) > > > >>>>>>> Per is a variable % > > > >>>>>>> X is a variable that is a percentage of P defined by a maximum > > > >>>>>>> allocation. > > > > >>>>>>> So main = (( R * X)/P)*100 > > > > >>>>>> First of all you should get your variables right.  Variable "Per" does > > > >>>>>> not show up in the formula and "main" is not mentioned in the list. > > > > >>>>>> The meaning of the formula is totally unclear to me.  From what you gave > > > >>>>>> you are calculating the fraction (R/P) multiply it with 100 (so you > > > >>>>>> actually get (R/P) percent and now you multiply with another percentage > > > >>>>>> (X).  So you have a percentage of a percentage. > > > > >>>>>>> What I want to test is the value of X needed to equal Per from X's > > > >>>>>>> maximum allocation down. > > > > >>>>>> Can you write down a formula that contains all variables in your list > > > >>>>>> and point at the fixed ones (constants), user inputs and variables you > > > >>>>>> want to resolve? > > > > >>>>>>> What i am thinking but cant get right > > > > >>>>>>> Say > > > > >>>>>>> R = 5 > > > >>>>>>> P = 10 > > > >>>>>>> Per = 190 > > > >>>>>>> X = max 80% of P > > > > >>>>>>> For X in main = Per ( Closest whole number or half that equals closest > > > >>>>>>> to but greater than Per) > > > >>>>>>> main = (( 5 * 8)/10)*100 > > > > >>>>>>> So in example intially main equalled 400%. And answer I would want to > > > >>>>>>> resolve it to is X = 4 which is 200% as 3.50 equals 180%. > > > > >>>>>>> Any ideas? > > > > >>>>>> Sorry you lost me somewhere along the path.  Also it's tea time right now... > > > > >>>>>> Cheers > > > > >>>>>>         robert > > > > >>>>>> -- > > > >>>>>> remember.guy do |as, often| as.you_can - without endhttp://blog.rubybestpractices.com/ > > > > >>>>> So I want to check by changing X when in forumla "main" that it is => > > > >>>>> than "per" > > > > >>>>> In simple terms I want to calculate units needed to reach a rate of > > > >>>>> return, X represents the variable units and per is the ROI(return of > > > >>>>> investment rate I would deaire to acheive), R is the ratio of return > > > >>>>> and P is a pool or base amount, I am using base 10 to start off with. > > > > >>>>> I am trying to test X for a value, the only constraint on X is that it > > > >>>>> cannot exceed 80% of the P or Pool amount. > > > >>>>> So if I set per = 190% > > > > >>>>> R = 5 > > > >>>>> P = 10 > > > >>>>> Per = 190 > > > >>>>> X = max 80% of P > > > > >>>>> For X in main >= per > > > > >>>>> main = (( 5 * X)/10)*100 >= 190% > > > > >>>>> so for X = 80% of P or 8 base units > > > > >>>>> main = (( 5 * 8)/10)*100 > > > > >>>>> which would test out as > > > > >>>>> main >= per > > > > >>>>> 400 => 190 - > > > > >>>>> So when X is 8 units the main section is greater than per but its not > > > >>>>> the closest whole unit to per. > > > > >>>>> So when X = 40% or 4 base units > > > > >>>>> main = (( 5 * 4)/10)*100 > > > >>>>> main >= per > > > >>>>> 200 >= 190 > > > > >>>>> this is the largest unit in 0.5 increments that remains greater than > > > >>>>> Per of 190 so I would want X once tested to resolve to this. > > > > >>>>> I hope that made sense. > > > > >>>> So how do I best get X to run a loop in 0.5 increments until it > > > >>>> reaches the closest value that makes the left side of an equation > > > >>>> greater or equal to the right. But where it is the lowest value that > > > >>>> is greater than or equal to the the right. > > > > >>>> Main => Per - where main is the lowest value it can be greater than > > > >>>> per. > > > > >>>> Cheers > > > > >>>> Sayth > > > > >>> Something's not right with your formulas (I suspect) > > > > >>>>>>> main = (( R * X)/P)*100 > > > > >>> and X = X*P > > > > >>> so... main =   > > > >>> R*(X*P) > > > >>> ----------- * 100 > > > >>>       P         > > > > >>> the P's cancel out... > > > >>> R*X*100 > > > > >>> varying P will not change the results of your calculations... > > > > >>> here's what I believe that you're asking for... > > > >>> ================================ > > > >>> r = 5.0 > > > >>> p = 10.0 > > > >>> per = 190.0 > > > >>> x = 0.8 > > > > >>> begin > > > >>>         main = ((r*(x*p))/p)*100   > > > >>>         lastSuccess = x if main >= per > > > >>>         x -= 0.05 > > > >>> end while main >= per > > > >>> puts "#{lastSuccess*100.0}%" > > > >>> =============================== > > > >>> note: you can change p al day long and always get the same answer > > > > >>> there are probably more "rubified" ways to express this. > > > >>> I've tried to maintain the approach you've stated.  However, I would simplify the equation first, and since the last X that succeeds as you decrement is the same thing as the first that succeeds as you're going up, I'd probably turn t into something like... > > > >>> =============================== > > > >>> r = 5.0 > > > >>> p = 10.0 > > > >>> per = 190.0 > > > >>> max_x = 0.8 > > > > >>> x = 0.05 > > > >>> const = r*100 # simplified without X > > > >>> x += 0.05 while (x*const < per) && (x <= max_x) > > > >>> puts x <= max_x ? "#{lastSuccess*100.0}%" : "no answer" > > > >>> =============================== > > > > >>> Mike Cargal > > > > >>> m...@cargal.nethttp://blog.mikecargal.com > > > > >> Thanks for looking at this for me. > > > > >>> You've really lost me when 80% turns into 8 (or 8 base units).  What is a base unit? And why would it be equal to 10%? > > > >>> Are you looking to vary X from 80% down by 5% increments? > > > > >> This test is the first of 4 I plan to make into one program. For each > > > >> their while be a maximum allocation so in this case 80% so may be 40% > > > >> etc. The pool in future will vary but I am using base 10 while I write > > > >> it(hoping it would be clearer for another person reading it). So that > > > >> means that X has a max allocation of units if 40% was the maximum > > > >> allocation and base 10 then X would be 4 units and I would want my > > > >> loop to test X from 0 to 4 in 0.5 increments. > > > > >> I am going to need more time to read your solution as I haven't got it > > > >> first read. I had started to look athttp://www.rubyist.net/~slagell/ruby/iterators.html > > > > >> and a solution flow similar to > > > > >> ruby> def WHILE(cond) > > > >>     |   return if not cond > > > >>     |   yield > > > >>     |   retry > > > >>     | end > > > >>    nil > > > >> ruby> i=0; WHILE(i<3) { print i; i+=1 } > > > >> 012   nil- Hide quoted text - > > > > >> - Show quoted text - > > > > > Actually after re-reading your post I get it. All but one small bit. > > > > > In your formula how does the ? "#{lastSuccess*100.0}%" bit work? what > > > > data does lastSuccess pull. > > > > > x = 0.05 > > > > const = r*100 # simplified without X > > > > x += 0.05 while (x*const < per) && (x <= max_x) > > > > puts x <= max_x ? "#{lastSuccess*100.0}%" : "no answer" > > > > my bad... > > > > r = 5.0 > > > p = 10.0 > > > per = 190.0 > > > max_x = 0.8 > > > > x = 0.05 > > > const = r*100 # simplified without X > > > x += 0.05 while (x*const < per) && (x <= max_x) > > > puts x <= max_x ? "#{x*100.0}%" : "no answer" > > > > Mike Cargal > > > > m...@cargal.nethttp://blog.mikecargal.com > > > I still think we first need to get the math correct before we can come > > > up with solutions.  Formulas I have seen in this thread look like they > > > could be solved with some simple transformations and do not need any > > > nested intervals or similar approximation algorithms.  So far I find the > > > problem description quite confusing. > > > Essentially without formulas all I am calculating is how many units at > > a specified rate of return it would take to reach a percentage of rate > > of return. Only additionally I have specified a maximum unit > > allocation. There would ultimately be several options with different > > return rates and max allocations from each pool. A pool is a > > percentage subset of a bank. > > > > x = 0.05 > > > const = r*100 # simplified without X > > > x += 0.05 while (x*const < per) && (x <= max_x) > > > puts x <= max_x ? "#{x*100.0}%" : "no answer" > > > Mikes solution definitely works for working units(X)..thank you. I > > need to set constants and obtain user inputs for different scenarios > > and call it to the function. > > > > could be solved with some simple transformations and do not need any > > > I need to lookup what a transformation is... > > This is where I was headed with it....any suggestions apprecaited. > > Bank = $500.00 # later to be a running total calculated > > def ROIcalc > const = r*100 # simplified without X > x += 0.05 while (x*const < per) && (x <= max_x) > puts x <= max_x ? "#{x*100.0}%" : "no answer" > end > > def pool > if Bank > 200 then Bank * 0.05 > Else 10.00 > end > > # Scenario 1 > a = ROIcalc(per = 190, max_x = 0.8, puts "What ratio of return do you > expect?" r = gets.chomp, pool) > b = ROIcalc(per = 200, max_x = 0.4, r = 12.00, pool) > # output result if valid > # or return no valid result choose another scenario or end. > > This is where I was headed. > > Bank = $500.00 # later to be a running total calculated > > def ROIcalc > const = r*100 # simplified without X > x += 0.05 while (x*const < per) && (x <= max_x) > puts x <= max_x ? "#{x*100.0}%" : "no answer" > end > > def pool > if Bank > 200 then Bank * 0.05 > Else $10.00 > end > > # Scenario 1 > a = ROIcalc(per = 190, max_x = 0.8, puts "What ratio of return do you > expect?" r = gets.chomp, pool) > b = ROIcalc(per = 200, max_x = 0.4, r = 12.00, pool) > # output result if valid > # or return no valid result choose another scenario or end. upated. Bank = $500.00 # later to be a running total calculated def ROIcalc const = r*100 # simplified without X x += 0.05 while (x*const < per) && (x <= max_x) puts x <= max_x ? "#{x*100.0}%" : "no answer" end def pool if Bank > 200 then Bank * 0.05 Else $10.00 end # Scenario 1 a = ROIcalc(per = 190, max_x = 0.8, puts "What ratio of return do you expect?" r = gets.chomp, pool) b = ROIcalc(per = 200, max_x = 0.4, r = 12.00, pool) if a + b > 10 then err = 10.00 - ( a + b) puts "Your exceeding your pool by" + err.to_s else a + b < 10 then readd = 10.00 - ( a + b) # then use readd to reassign extra units in ratio 75/25 to a and b end