여러 열의 데이터를 포함하는 데이터 파일이 있습니다.이 데이터 파일에서 3 개의 열 (좌표를 나타내는)을 추출하여 다른 파일에 넣은 다음 새로 만든 파일을 사용하여 평면에 맞추거나 scipy.optimize.curve_fit을 사용하여 표면 (또는 당신이 부르고 싶은 무엇이든). 내 코드는 다음과 같습니다.
# -*- coding: utf-8 -*-
from pylab import *
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
from scipy.optimize import curve_fit
### processing function
def store(var,textfile):
data=loadtxt(textfile,skiprows=1)
p0=[]
p1=[]
p2=[]
for i in range(0,len(data)):
p0.append(float(data[i,2]))
p1.append(float(data[i,3]))
p2.append(float(data[i,4]))
var.append(p0)
var.append(p1)
var.append(p2)
#extracting the data from a textfile
datafile1='cracks_0101005_5k_tensionTestCentreCrack_l0.001a0_r0.01.txt'
a1=[]
store(a1, datafile1)
rcParams.update({'legend.numpoints':1,'font.size': 20,'axes.labelsize':25,'xtick.major.pad':10,'ytick.major.pad':10,'legend.fontsize':14})
lw=2
ms=10
#fitting a surface(curve) into the data
def func(data, m, n, o):
return m*data[:,0] + n*data[:,2] + o
guess=(1,1,1)
params, pcov = curve_fit(func, a1[::2, :2], a1[:,1], guess)
print (params)
그리고 다음과 같은 오류 메시지가 나타납니다.
Traceback (most recent call last):
File "fitcurve.py", line 41, in <module>
params, pcov = curve_fit(func, a1[::2, :2], a1[:,1], guess)
TypeError: list indices must be integers, not tuple
내가 뭘 잘못하고 있는지 말해 주시겠습니까?
좀 더 명확하게하기 위해 : Y를 내 종속 함수로 사용하려고하므로 X와 Z의 함수가 될 것입니다. 분명히 a1[]
배열이 아니라 목록입니까? 그러나 배열로 변경해도 Myarray=np.asarray(a1)
다른 이상한 메시지가 나타납니다. 누군가가 여기서 문제를 이해하도록 도와 주시면 감사하겠습니다.
건배
코드에서 발견 한 가능한 오류는 다음과 같습니다.
y
함수 로 맞추고 싶으 x,z
므로 보내려는 X
배열은 아마도 a1[:, ::2]
. 그러나 그것은 func
이미 m,2
배열을 얻었 으므로 여기에 return m*data[:,0] + n*data[:,1] + o
여전히 있어야합니다. 나는 그것이 3이 아닌 2 개의 매개 변수가되어야한다고 생각합니다. m,n,o
그 결과로부터 가능한 것을 계산할 수 있습니다 .
import matplotlib
matplotlib.use('Qt5Agg')
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from matplotlib import style
from random import random
style.use('ggplot')
from scipy.optimize import curve_fit
""" make some data and save to file """
data=[]
a,b,s=1.233,-2.17,5.2
for i in range(88):
x=10*(2*random()-1)
y=10*(2*random()-1)
z=a*x+b*y+s*(2*random()-1)*.5
data+=[[x,y,z]]
data=np.array(data)
np.savetxt("data.txt", data)
""" get the data and use unpack to directly write into x,y,z variables"""
xData,yData,zData=np.loadtxt("data.txt", unpack=True)
"""...while I actally need the packed version as well, so I could load again"""
#allData=np.loadtxt("data.txt")
"""...or..."""
allData=np.array(zip(xData,yData,zData))
def func(data, m, o):
return m*data[:,0] + o*data[:,1]
guess=(1,1)
params, pcov = curve_fit(func, allData[:, ::2], allData[:,1], guess)
""" showing data and fit result"""
x=np.linspace(-10,10,10)
y=np.linspace(-10,10,10)
X,Y=np.meshgrid(x,y)
Z=-params[0]/params[1]*X+1/params[1]*Y
fig1 = plt.figure(1)
ax=fig1.add_subplot(1,1,1, projection='3d')
ax.scatter(xData,yData,zData)
ax.plot_wireframe(X,Y,Z,color='#4060a6',alpha=.6)
ax.set_title("({:1.2f},{:1.2f})".format(-params[0]/params[1],1/params[1]))
plt.show()
당신이 장착 중에 있습니다 y=m*x+o*z
내가의 와이어 프레임 그릴 z=a*x+b*y
MIT의 b=1/o
싶게 a=-m/o
, 즉 n=1
. m,n,o
그에 따라 크기를 조정할 수 있습니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다