La regresión lineal que usa scipy.ODR falla (no tiene rango completo en la solución)

Así que estaba intentando una regresión lineal con scipy.odr. Sin embargo, fracasó estrepitosamente. scipy.odr me ha funcionado antes y no veo ningún error en mi código. La única razón por la que puedo pensar es que la pendiente puede ser demasiado pequeña, pero no veo cómo eso podría molestar a Scipy. Gracias por tu ayuda.

El código:

#!/usr/bin/env python3 -i # -*- coding: iso-8859-1 -*- import matplotlib.pyplot as plt import numpy as np from scipy.odr import * fig = plt.figure() ax1 = fig.add_subplot(111) x = np.linspace(0,1E15,10) y = 1E-15*x-2 ax1.set_xlim(-0.05E15,1.1E15) ax1.set_ylim(-2.1, -0.7) ax1.plot(x, y, 'o') # Fit using odr def f(B, x): return B[0]*x + B[1] linear = Model(f) mydata = RealData(x, y) myodr = ODR(mydata, linear, beta0=[1., 2.]) myoutput = myodr.run() myoutput.pprint() a, b = myoutput.beta sa, sb = myoutput.sd_beta xp = np.linspace(ax1.get_xlim()[0], ax1.get_xlim()[1], 1000) yp = a*xp+b ax1.plot(xp,yp) plt.show() 

Esta es la salida de terminal resultante:

 Beta: [ -4.84615388e-15 2.00000000e+00] Beta Std Error: [ 8.14077323e-16 0.00000000e+00] Beta Covariance: [[ 1.46153845e-31 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00]] Residual Variance: 4.534412955465587 Inverse Condition #: 1.0 Reason(s) for Halting: Problem is not full rank at solution Parameter convergence 

Y este el gráfico resultante:

Regresión sin sentido

edición: mi código para la regresión estándar proviene de http://docs.scipy.org/doc/scipy/reference/odr.html

 import numpy as np import matplotlib.pyplot as plt fig = plt.figure() ax1 = fig.add_subplot(111) x = np.linspace(0,1E15,10) y = 1E-15*x-2 ax1.set_xlim(-0.05E15,1.1E15) ax1.set_ylim(-2.1, -0.7) ax1.plot(x, y, 'o') # Fit using odr def f(B, x): return B[0]*x + B[1] sx = np.std(x) sy = np.std(y) linear = Model(f) mydata = RealData(x=x,y=y, sx=sx, sy=sy) myodr = ODR(mydata, linear, beta0=[1.00000000e-15, 2.]) myoutput = myodr.run() myoutput.pprint() a, b = myoutput.beta sa, sb = myoutput.sd_beta xp = np.linspace(min(x), max(x), 1000) yp = a*xp+b ax1.plot(xp,yp) plt.show() 

introduzca la descripción de la imagen aquí