Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 最小二乘拟合的分段函数_Python_Numpy_Least Squares_Piecewise - Fatal编程技术网

Python 最小二乘拟合的分段函数

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

我试图从3次测量中提取8个参数。 为了同时在3个度量值上实现这一点,我将逐个执行函数。 此技术适用于optimize.curvefit,但我无法强制程序在我的设置中获得正确的错误。这些条件很快就满足了

所以我现在尝试使用leastsquare,因为我知道我可以用fscale调整数据和拟合参数之间的间隙。 不幸的是,我收到以下错误消息:“NumPy布尔数组索引分配无法将29个输入值分配给掩码为true的1个输出值”,并且我在其分辨率中阻塞

谢谢你的帮助

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)

有人能帮我解决这个问题吗?有人能帮我解决这个问题吗?