Ваш график выглядит экспоненциальным, потому что вы устанавливаете конечное граничное условие равным 1000, если вы устанавливаете начальную границу равным 1000, тогда он выглядит ближе к графику, который вы предложили:
#set b.c.s
b[:,:]=20
b[0,:]=1000
Также я думаю, что выздесь ошиблись:
M[0,0]=1
M[N-2,N-2]=1
print(M)
Я думаю, что это должно быть:
M[0,0]=1
M[N,N]=1
print(M)
, поскольку это устанавливает последнее значение равным 1, а не вторым по последнему диагональному элементу.
После изменения М снова, чтобы фактически быть последним элементом.Я также думаю, что частью проблемы является количество времени, которое мы уделяем этому.Пример графика, который вы дали, уходит в t = 1e9 секунд.Таким образом, если мы сделаем t очень большим, чем только график 10 решений, это будет выглядеть намного более похоже на этот пример.Вот мой код для этого:
t = 100000
soln = np.zeros((N+1, t))
for j in range(0, t, 1):
LU, P = lin.lu_factor(M)
vector = lin.lu_solve((LU, P), b)
b = vector
flat_list = []
for sublist in vector:
for item in sublist:
flat_list.append(item)
soln[:, j] = flat_list
for k in range(0, t, int(t/10)):
plt.plot(x, soln[:, k], label='x')
# plt.xlabel("k")
# plt.ylabel("vector element")
# pylab.legend(loc='upper right')
plt.show()