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")。如果你想要一个线图,你必须列出nr绘制它们。对于带有标记的列表: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()

您这样做的方式会创建一个新图,每个循环都有一个点。

此外,如果您打算增加n,我建议检查更有效的循环方式(例如列表理解或itertools

于 2013-03-10T14:56:18.083 回答
0

我不确定这是否是您想要的(阅读您的描述,我认为是,但查看您的代码看起来您​​正在尝试做一些更困难的事情)。

如果您真的想获得序列1, 2, 4, 8, 16, ...,我鼓励您在一次操作中处理整个数组,而不是使用 for 循环。它更具表现力,并且对于大型数组来说更快。

反正:

>>> 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()

输出

于 2013-03-10T16:45:49.413 回答