Python 最小二乘拟合的分段函数
我试图从3次测量中提取8个参数。 为了同时在3个度量值上实现这一点,我将逐个执行函数。 此技术适用于optimize.curvefit,但我无法强制程序在我的设置中获得正确的错误。这些条件很快就满足了 所以我现在尝试使用leastsquare,因为我知道我可以用fscale调整数据和拟合参数之间的间隙。 不幸的是,我收到以下错误消息:“NumPy布尔数组索引分配无法将29个输入值分配给掩码为true的1个输出值”,并且我在其分辨率中阻塞 谢谢你的帮助Python 最小二乘拟合的分段函数,python,numpy,least-squares,piecewise,Python,Numpy,Least Squares,Piecewise,我试图从3次测量中提取8个参数。 为了同时在3个度量值上实现这一点,我将逐个执行函数。 此技术适用于optimize.curvefit,但我无法强制程序在我的设置中获得正确的错误。这些条件很快就满足了 所以我现在尝试使用leastsquare,因为我知道我可以用fscale调整数据和拟合参数之间的间隙。 不幸的是,我收到以下错误消息:“NumPy布尔数组索引分配无法将29个输入值分配给掩码为true的1个输出值”,并且我在其分辨率中阻塞 谢谢你的帮助 from scipy.optimize im
from scipy.optimize import least_squares
import matplotlib.pyplot as plt
import numpy as np
l, t = [], []
with open("Test.txt", "r") as f_read:
for line in f_read:
line = line.strip() #suppression du retour charriot en fin de ligne
if line:
ti, vi = [float(elt) for elt in line.split("\t")] #conversion en nb
l.append(ti), t.append(vi)
for i in range(len(t)-7) :
t[i]=(np.sin(t[i]/180*np.pi))**2
t=np.array(t)
l=np.array(l)
def fun1(A,x,y):
f=A[0]+A[1]/(x**2-A[2])-A[3]*x**2
return f-y
def fun2(A,x,y):
f=A[4]+A[5]/(x**2-A[6])-A[7]*x**2
return f-y
def fun3(A,x,y):
no=1/(A[0]+A[1]/(x**2-A[2])-A[3]*(x**2))
ne=1/(A[4]+A[5]/(x**2-A[6])-A[7]*(x**2))
no2=1/(A[0]+A[1]/((x/2)**2-A[2])-A[3]*((x/2)**2))
f=(no2-no)/(ne-no)
return f-y
def fun4(A,x,y):
x=x-2
l2=1.064
l3=(1/x+1/l2)**(-1)
no3=np.sqrt(A[0]+A[1]/(l3**2-A[2])-A[3]*(l3**2))
no1=1/(A[0]+A[1]/(x**2-A[2])-A[3]*(x**2))
ne1=1/(A[4]+A[5]/(x**2-A[6])-A[7]*(x**2))
no2=1/(A[0]+A[1]/(l2**2-A[2])-A[3]*(l2**2))
ne2=1/(A[4]+A[5]/(l2**2-A[6])-A[7]*(l2**2))
X=(no1*(np.cos(y*180/np.pi))**2+ne1*(np.sin(y*180/np.pi))**2)**(-1/2)
Y=(no2*(np.cos(y*180/np.pi))**2+ne2*(np.sin(y*180/np.pi))**2)**(-1/2)
f=no3/l3-X/x-Y/l2
return f
A=2.84507614e+00
B=1.37848818e-02
C=3.68428479e-02
D=2.43158022e-03
E=2.88095276e+00
F=3.12234625e-02
G=2.40374019e-02
H=3.88776226e-03
p0 = np.array([A,B,C,D,E,F,G,H])
def piecewise_linear(A,x,y):
x0 = 0.7
x1 = 1
x2 = 3
return np.piecewise(x,
[x < x0,
(x >= x0) & (x < x1),
(x >= x1) & (x < x2),
x >= x2],
[lambda x: fun1(A,x,y),
lambda x: fun2(A,x,y),
lambda x: fun3(A,x,y),
lambda x: fun4(A,x,y)])
p = least_squares(piecewise_linear, p0, loss='soft_l1', f_scale=0.0001, args=(l, t)
, max_nfev=100000)
print(p.x)
从scipy.optimize导入最小二乘法
将matplotlib.pyplot作为plt导入
将numpy作为np导入
l、 t=[],[]
打开(“Test.txt”、“r”)作为f_读取:
对于f_中的行,请阅读:
line=line.strip()#抑制翅片对齐后的旋转
如果行:
ti,vi=[直线分割(“\t”)中elt的浮动(elt)]#转换en nb
l、 附加(ti),t.append(vi)
对于范围内的i(透镜(t)-7):
t[i]=(np.sin(t[i]/180*np.pi))**2
t=np.数组(t)
l=np.数组(l)
def fun1(A、x、y):
f=A[0]+A[1]/(x**2-A[2])-A[3]*x**2
返回f-y
def fun2(A、x、y):
f=A[4]+A[5]/(x**2-A[6])-A[7]*x**2
返回f-y
def fun3(A、x、y):
否=1/(A[0]+A[1]/(x**2-A[2])-A[3]*(x**2))
ne=1/(A[4]+A[5]/(x**2-A[6])-A[7]*(x**2))
no2=1/(A[0]+A[1]/((x/2)**2-A[2])-A[3]*((x/2)**2))
f=(第2号)/(东北部)
返回f-y
def fun4(A、x、y):
x=x-2
l2=1.064
l3=(1/x+1/l2)**(-1)
no3=np.sqrt(A[0]+A[1]/(l3**2-A[2])-A[3]*(l3**2))
no1=1/(A[0]+A[1]/(x**2-A[2])-A[3]*(x**2))
ne1=1/(A[4]+A[5]/(x**2-A[6])-A[7]*(x**2))
no2=1/(A[0]+A[1]/(l2**2-A[2])-A[3]*(l2**2))
ne2=1/(A[4]+A[5]/(l2**2-A[6])-A[7]*(l2**2))
X=(no1*(np.cos(y*180/np.pi))**2+ne1*(np.sin(y*180/np.pi))**2)**(-1/2)
Y=(no2*(np.cos(Y*180/np.pi))**2+ne2*(np.sin(Y*180/np.pi))**2)**(-1/2)
f=no3/l3-X/X-Y/l2
返回f
A=2.84507614e+00
B=1.37848818e-02
C=3.68428479e-02
D=2.43158022e-03
E=2.88095276e+00
F=3.12234625e-02
G=2.40374019e-02
H=3.88776226e-03
p0=np.数组([A,B,C,D,E,F,G,H])
def分段线性(A,x,y):
x0=0.7
x1=1
x2=3
返回np.分段(x,
[x=x0)和(x=x1)和(x=x2],
[lambda x:fun1(A,x,y),
λx:fun2(A,x,y),
λx:fun3(A,x,y),
λx:fun4(A,x,y)])
p=最小二乘法(分段线性,p0,损失率=soft\u l1',f\u标度=0.0001,args=(l,t)
,最大值(nfev=100000)
印刷品(p.x)
有人能帮我解决这个问题吗?有人能帮我解决这个问题吗?