0

基本的に、x軸にn、y軸にrを使用してグラフをプロットしようとしています

したがって、n=1 の場合は r=1、n=2 は r=2、n=3 は r=4、n=4 は 8、そして拡張する予定です。

私はこれを試しました:

import scipy
import scipy.linalg
import numpy as np
from matplotlib import pyplot as plt


for n in range(1,5):
    A=np.identity(n)
    for i in range(0,n):
        for j in range(0,i):
            A[i,j]=-1
    A[:,n-1]=1
    x=np.random.randn(n,1)
    b=A*x
    P, L, U = scipy.linalg.lu(A)
    print A
    r=U.max()/A.max()
    print r
    print n
    plt.plot(n,r)
    plt.show()

ただし、n のすべての値ではなく、対応する r の値に対して n の最大値のみをプロットします。私が間違っているのかわかりません。

前もって感謝します

4

3 に答える 3

1

plt.plot()線とマーカーをプロットできます。デフォルトでは、線のみをプロットします。単一のポイントのみを指定するため、線を描画できず、マーカーも描画されません。マーカーをオンにするには、属性marker="o":を設定しますplt.plot(x, y, markers="o")。ライン プロットが必要な場合は、nとのリストを作成し、rそれらをプロットする必要があります。マーカー付きのリスト: http://matplotlib.org/api/artist_api.html#matplotlib.lines.Line2D.set_marker

plt.show()また、 for ループから取り出したい場合もあります。反復ごとに更新された図が作成されますが、それが必要かどうかはわかりません。

于 2013-03-10T15:07:24.223 に答える
0

最初にプロットする配列を作成してからプロットする必要があります

rr, nn = [], []
for n in range(1,5):
    A=np.identity(n)
    for i in range(0,n):
        for j in range(0,i):
            A[i,j]=-1
    A[:,n-1]=1
    x=np.random.randn(n,1)
    b=A*x
    P, L, U = scipy.linalg.lu(A)
    print A
    r=U.max()/A.max()
    print r
    print n
    rr.append(r)
    nn.append(n)

plt.plot(nn,rr)
plt.show()

この方法では、ループごとに1つのポイントを持つ新しいプロットが作成されます。

さらに、増やす予定がある場合はn、より効率的なループの方法(リスト内包表記やitertoolsなど)を確認することをお勧めします。

于 2013-03-10T14:56:18.083 に答える
0

これがあなたが望むものかどうかはわかりません(あなたの説明を読んで、そうだと思いますが、あなたのコードを見ると、もっと難しいことをしようとしているように見えます)。

本当にシーケンスを取得しようとしている場合は1, 2, 4, 8, 16, ...、for ループを使用するのではなく、1 回の操作で配列全体を操作することをお勧めします。より表現力があり、大規模な配列の場合ははるかに高速です。

ともかく:

>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> 
>>> n = np.arange(5)
>>> r = 2 ** n
>>> r
array([ 1,  2,  4,  8, 16])
>>> plt.plot(n, r, 'ob')
[<matplotlib.lines.Line2D object at 0x102d8ee10>]
>>> plt.show()

mpl 出力

于 2013-03-10T16:45:49.413 に答える