[SciPy-User] scipy.optimize.fixed_point -- TypeError: can't multiply sequence by non-int of type 'float'

Warren Weckesser warren.weckesser at enthought.com
Wed Sep 5 08:37:58 EDT 2012


On Wed, Sep 5, 2012 at 7:33 AM, Warren Weckesser <
warren.weckesser at enthought.com> wrote:

>
>
> On Tue, Sep 4, 2012 at 2:06 PM, Ted To <rainexpected at theo.to> wrote:
>
>> Hi,
>>
>> I'm having trouble figuring out what I'm doing wrong here.  I have a
>> function br(p,q) defined where p and q are lists of length 2 and I'm
>> trying to compute the fixed point of br for a given q.  E.g.,
>> fixed_point(br,x0=p,args=(q,)).  The problem is that I get a TypeError
>> (the Traceback at the end of this message).  I don't know if this could
>> be the cause or not but br is defined as the argmin of another function
>> which I've defined (the code is currently pretty ugly but you can find
>> it at http://pastebin.com/rEc6cKfd).
>>
>> Any help or suggestions will be much appreciated.
>>
>> Thanks,
>> Ted To
>>
>> TypeError                                 Traceback (most recent call
>> last)
>> /usr/lib/python2.7/dist-packages/IPython/utils/py3compat.pyc in
>> execfile(fname, *where)
>>     176             else:
>>     177                 filename = fname
>> --> 178             __builtin__.execfile(filename, *where)
>>
>>
>> /home/ted/texfiles/smoking/quality-computations/quality-provision-equilibrium.py
>> in <module>()
>>      66   return fixed_point(br,x0=p,args=(q,))
>>      67
>> ---> 68 print eqP(p,q)
>>      69
>>      70 def gstar(q):
>>
>>
>> /home/ted/texfiles/smoking/quality-computations/quality-provision-equilibrium.py
>> in eqP(p, q)
>>      63
>>      64 def eqP(p,q):
>> ---> 65   print fixed_point(br,x0=p,args=(q,))
>>      66   return fixed_point(br,x0=p,args=(q,))
>>      67
>>
>> /usr/lib/python2.7/dist-packages/scipy/optimize/minpack.pyc in
>> fixed_point(func, x0, args, xtol, maxiter)
>>     509             p1 = func(p0, *args)
>>     510             p2 = func(p1, *args)
>> --> 511             d = p2 - 2.0 * p1 + p0
>>     512             p = where(d == 0, p2, p0 - (p1 - p0)*(p1 - p0) / d)
>>     513             relerr = where(p0 == 0, p, (p-p0)/p0)
>>
>> TypeError: can't multiply sequence by non-int of type 'float'
>>
>
>
> I suspect your function is returning a list in some cases.
>


Now that I reread your email, I see there was no need for me to "suspect"
this.  In the link you provided, it shows that br returns [p0, p1].  Change
the return value to `array([p0, p1])` (and add the appropriate import of
`array`).

Warren

  In the multivariate case, the fixed_point function expects the return
> value of your function to be a numpy array.  Modify your code to ensure
> that br always return a numpy array, and see if that fixes the problem.
> (One option might be to pass in the parameters as arrays instead of lists.
> .e.g fixed_point(br, x0=p, args=(array(q),)), but that depends on how br is
> implemented.)
>
> Warren
>
>
> _______________________________________________
>> SciPy-User mailing list
>> SciPy-User at scipy.org
>> http://mail.scipy.org/mailman/listinfo/scipy-user
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.scipy.org/pipermail/scipy-user/attachments/20120905/36041431/attachment.html>


More information about the SciPy-User mailing list