On Oct 30, 2:26 am, Jason Grout <jason-s...@creativetrax.com> wrote:
> On 10/29/10 5:59 PM, Oscar Gerardo Lazo Arjona wrote:
>
>
>
> > I want to propose the following changes to the output format of find_fit
> > and solve:
>
> > for find_fit the current output format is a list of equations:
>
> > sage: data = [(i, 1.2 * sin(0.5*i-0.2) + 0.1 * normalvariate(0, 1)) for
> > i in xsrange(0, 4*pi, 0.2)]
> > sage: var('a, b, c, x')
> > sage: model(x) = a * sin(b * x - c)
> > sage: find_fit(data, model)
>
> > [a == 1.2204167610363676, b == 0.50171964598627838, c
> > ==0.22401763827376933]
>
> > or a dictionary:
>
> > sage: find_fit(data,model,solution_dict=True)
>
> > {c: 0.22401763827376933, b: 0.50171964598627838, a: 1.2204167610363676}
>
> > I'd like to get an expression where the values found for the parameters
> > are put in the model given to find_fit:
>
> > sage: find_fit(data, model)
> > 1.2204167610363676*sin(0.50171964598627838 *x -0.22401763827376933 )
>
> Why not make solution_dict=True the default, since then you could say:
>
> fit=find_fit(data,model)
> model.subs(fit)
>
> to get the model with those parameters?
>
> In fact, it would be great if this worked too:
>
> fit=find_fit(data,model)
> model(**fit)
>
> but (even if solution_dict=True is the default) that complains that the
> keys in the dictionary are not strings.
>
> However, we could make this work:
>
> fit=find_fit(data,model)
> model(fit)
>
> but it require changes to the __call__ method to allow a dictionary
> input that would do the same as .subs() would do if handed a dictionary.
>
>
>
>
>
> > For solve the current output format depends on the input:
>
> > sage: var('x y')
> > sage: eq1=x+4==0
> > sage: eq2=x^2+4*x+2==0
> > sage: sys1=x+y==1
> > sage: sys2=x-2*y==-2
> > sage: solve(eq1,x)
> > [x == -4]
> > A list containing solutions (even when there is only one solution).
>
> > sage: solve(eq2,x)
> > [x == -sqrt(2) - 2, x == sqrt(2) - 2]
> > A list containing solutions when there is more than one solution
>
> > solve([sys1,sys2],x,y)
> > [[x == 0, y == 1]]
> > A list containing a list containing solutions (this is the worst)
>
> > The format I would like to see is:
>
> > sage: solve(eq1,x)
> > x == -4
> > A single equation
>
> > sage: solve(eq2,x)
> > [x == -sqrt(2) - 2, x == sqrt(2) - 2]
> > This one is fine
>
> > solve([sys1,sys2],x,y)
> > [x == 0, y == 1]
> > Just a list of solutions. It is harder to work with the solutions if
> > they are inside another list.
>
> What if there are two different solutions, like (x=0, y=0) and (x=0,y=1)?
>
> Personally, I think returning an equation is okay for situations where I
> am just checking something, and don't plan on using the solution again.
>   Returning a list of equations is horrible for actually doing anything
> with the results, which is my intent in the vast majority of situations.
>   Having to always append the not-very-obvious "solution_dict=True" to
> use solve in the common case is not very user-friendly.  If we're
> changing the output of solve, I'd propose returning either a single
> dictionary (a single solution) or a list of dictionaries (multiple
> solutions).  Solve seems like it would be much more useful that way.
>
> Thanks,
>
> Jason

Making solution_dict the default seems apropiate for find_fit and
solve. I still would prefer a symbolic result for find_fit though (at
least an option to get that). Usually when one fits some data to a
model what one is trying to do is to interpolate data in between the
current data (plot the fitted function etc). Mathematica uses this two
outputs in two different functions:

For Fit they use a symbolic output: 
http://reference.wolfram.com/mathematica/ref/Fit.html

For FindFit they use something that looks like a dictionary:
http://reference.wolfram.com/mathematica/ref/FindFit.html

As for solve, I agree, we should return a single dictionary when
there's just one solution and a list of dictionaries when there's more
than one solution.

thanks!

Oscar

-- 
To post to this group, send an email to sage-devel@googlegroups.com
To unsubscribe from this group, send an email to 
sage-devel+unsubscr...@googlegroups.com
For more options, visit this group at http://groups.google.com/group/sage-devel
URL: http://www.sagemath.org

Reply via email to