質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

874閲覧

頂点から曲面を算出する

bio3H

総合スコア22

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/09/15 09:32

前提・実現したいこと

このサイトを参考に点群から曲面を算出する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行列も同様です。
これがエラーにつながっているか分かりませんが,個人的になぜこのように動作しているのが分かりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

細かいことは分かっていないですが下記を参考に行列のランクを確認したら1だったので、それが原因だと思います。
http://hirotaka-hachiya.hatenablog.com/entry/2014/07/19/234720

投稿2019/09/15 09:43

pea

総合スコア419

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bio3H

2019/09/16 07:05

回答ありがとうございます! 上記にも書いたのですが、 ------------------------------------------------------------------------------------------------------------ 28行目のA[i,j]=sum([basefunc(bivec, xvec)*basefunc(bjvec, xvec) for xvec in x])が(i,j)=(0,0)の時のみ,動いていました。そのためA行列が行0列0以外が0になっています。b行列も同様です。 これがエラーにつながっているか分かりませんが,個人的になぜこのように動作しているのが分かりません。 ------------------------------------------------------------------------------------------------------------ そのため行列のランクが1になってしまいます。この部分をすべての行・列で正常に処理できれば動作すると思うのですが、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問