[Scipy-svn] r6208 - trunk/scipy/optimize
scipy-svn at scipy.org
scipy-svn at scipy.org
Mon Jan 18 04:53:13 EST 2010
Author: pearu
Date: 2010-01-18 03:53:13 -0600 (Mon, 18 Jan 2010)
New Revision: 6208
Modified:
trunk/scipy/optimize/minpack.py
Log:
Fix leastsq when used with improper inputs: catching N<=M violation and fixed the crash with full output enabled.
Modified: trunk/scipy/optimize/minpack.py
===================================================================
--- trunk/scipy/optimize/minpack.py 2010-01-18 05:20:15 UTC (rev 6207)
+++ trunk/scipy/optimize/minpack.py 2010-01-18 09:53:13 UTC (rev 6208)
@@ -178,7 +178,7 @@
Description:
Return the point which minimizes the sum of squares of M
- (non-linear) equations in N unknowns given a starting estimate, x0,
+ (non-linear) equations in N<=M unknowns given a starting estimate, x0,
using a modification of the Levenberg-Marquardt algorithm.
x = arg min(sum(func(y)**2,axis=0))
@@ -289,6 +289,8 @@
n = len(x0)
if type(args) != type(()): args = (args,)
m = check_func(func,x0,args,n)[0]
+ if n>m:
+ raise TypeError('Improper input: N=%s must not exceed M=%s' % (n,m))
if Dfun is None:
if (maxfev == 0):
maxfev = 200*(n+1)
@@ -329,15 +331,17 @@
mesg = errors[info][0]
if full_output:
- from numpy.dual import inv
- from numpy.linalg import LinAlgError
- perm = take(eye(n),retval[1]['ipvt']-1,0)
- r = triu(transpose(retval[1]['fjac'])[:n,:])
- R = dot(r, perm)
- try:
- cov_x = inv(dot(transpose(R),R))
- except LinAlgError:
- cov_x = None
+ cov_x = None
+ if info in [1,2,3,4]:
+ from numpy.dual import inv
+ from numpy.linalg import LinAlgError
+ perm = take(eye(n),retval[1]['ipvt']-1,0)
+ r = triu(transpose(retval[1]['fjac'])[:n,:])
+ R = dot(r, perm)
+ try:
+ cov_x = inv(dot(transpose(R),R))
+ except LinAlgError:
+ pass
return (retval[0], cov_x) + retval[1:-1] + (mesg,info)
else:
return (retval[0], info)
More information about the Scipy-svn
mailing list