前提・実現したいこと
このサイトを参考に点群から曲面を算出するpythonプログラムを作成したいのですが,エラーが発生してしまっています。ただコピペしただけですが,なぜエラーが出るか分かりません。
発生している問題・エラーメッセージ
Traceback (most recent call last): File "D:/Python_Project/surfaceplot.py", line 32, in <module> c=numpy.linalg.solve(A, b) File "C:\Python36\lib\site-packages\numpy\linalg\linalg.py", line 403, in solve r = gufunc(a, b, signature=signature, extobj=extobj) File "C:\Python36\lib\site-packages\numpy\linalg\linalg.py", line 97, in _raise_linalgerror_singular raise LinAlgError("Singular matrix") numpy.linalg.LinAlgError: Singular matrix
該当のソースコード
Python
1#This source code is public domain 2from matplotlib.font_manager import FontProperties 3from mpl_toolkits.mplot3d import axes3d 4import matplotlib.pyplot as plt 5import numpy 6 7numpy.random.seed(11) 8x0=numpy.random.rand(10) 9x0=x0-min(x0);x0*=10/max(x0) 10x1=numpy.random.rand(10)*10 11x1=x1-min(x1);x1*=10/max(x1) 12y=10-((x0-5)**2+(x1-5)**2)*0.05+numpy.random.rand(10)*10 13x=zip(x0,x1) 14 15ordnung=2,2 16 17#ab hier gueltig fuer beliebige Dimension 18 19faktor=[i+1 for i in ordnung]+[1] 20for i in reversed(range(1,len(faktor))): faktor[i-1]=faktor[i-1]*faktor[i] 21base=numpy.asarray([[((i/faktor[j+1])%(ordnung[j]+1)) for j in range(len(ordnung))] for i in range(faktor[0])]) 22def basefunc(b,x): return numpy.prod([xi**bi for xi,bi in zip(x,b)]) 23 24N=len(base) 25A=numpy.zeros((N,N)) 26for i,bivec in zip(range(N),base): 27 for j,bjvec in zip(range(N),base): 28 A[i,j]=sum([basefunc(bivec, xvec)*basefunc(bjvec, xvec) for xvec in x]) 29b=numpy.zeros((N)) 30for i,bivec in zip(range(N),base): 31 b[i]=sum([basefunc(bivec, xvec)*yi for xvec,yi in zip(x,y)]) 32c=numpy.linalg.solve(A, b) 33 34#bis hier gueltig fuer beliebige Dimension 35 36xneu=numpy.meshgrid(numpy.linspace(0, 10, num=20), numpy.linspace(0, 10, num=20)) 37xneuPairs=zip(xneu[0].ravel(),xneu[1].ravel()) 38yneu=numpy.array([sum([ci*basefunc(b, xvec) for b,ci in zip(base,c)]) for xvec in xneuPairs]) 39yneu.shape=xneu[0].shape 40 41fig = plt.figure() 42ax2 = fig.add_subplot(111) 43ax = fig.add_subplot(111, projection='3d') 44X, Y, Z = xneu[0],xneu[1],yneu 45p0=ax2.scatter([0],[0]) 46p1=ax.scatter(x0, x1, y, zdir='z') 47p2=ax.plot_wireframe(X, Y, Z, color='r', rstride=1, cstride=1) 48lx0=ax.set_xlabel(' x1 ') 49lx1=ax.set_ylabel(' x2 ') 50ly=ax.set_zlabel(' y ') 51 52font = FontProperties() 53font.set_size('medium') 54leg = plt.legend((p0,p2),('Messpunkte','Modellfunktion'),frameon=True,loc='lower right',prop=font) 55leg.draggable() 56plt.show()
試したこと
28行目のA[i,j]=sum([basefunc(bivec, xvec)*basefunc(bjvec, xvec) for xvec in x])が(i,j)=(0,0)の時のみ,動いていました。そのためA行列が行0列0以外が0になっています。b行列も同様です。
これがエラーにつながっているか分かりませんが,個人的になぜこのように動作しているのが分かりません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/16 07:05