Я делаю алгоритм Гаусса-Ньютона на Python, но я думаю, что мой ответ почему-то неверен. На первой итерации он возвращает истинные значения, но я думаю, что другие итерации ошибочны. На странице википедии они дали примерный вопрос, но мой код показывает неправильные значения. Я пробовал этот топи c, но у меня это не сработало. В моем коде есть ошибка? Я не понимаю и не мог решить эту проблему несколько дней.
Вопрос моего учителя:
x = [0.25, 0.75, 1.25, 1.75, 2.25]
y = [0.28, 0.57, 0.68, 0.74, 0.79]
inial values a0 = 1, a1 = 1
f(x) = a0*(1–e^(–a1*x))
df/da0 = 1–e^(–a1*x)
df/da1 = a0*x*(1–e^(–a1x))
Это мой код решает эту проблему (я думаю):
import scipy
import matplotlib.pyplot as plt
import numpy as np
from numpy.linalg import inv
import math
import scipy.misc
from math import e
def GaussNewtonMethod(startpoints):
x = np.array([0.25, 0.75, 1.25, 1.75, 2.25])
y = np.array([0.28, 0.57, 0.68, 0.74, 0.79])
CalculatedPoints = startpoints
for k in range(5):
# Calculate Z
Z = []
for i in range(len(x)):
Z.append([1-pow(e,-CalculatedPoints[1]*x[i]),CalculatedPoints[0]*x[i]*pow(e,-CalculatedPoints[1]*x[i])])
D = []
for i in range(len(y)):
D.append(y[i]-Z[i][0]);
D = np.array(D)
Z = np.array(Z)
ZT = Z.transpose()
eq1 = ZT.dot(Z)
eq2 = inv(eq1)
eq3 = eq2.dot(ZT)
eq4 = eq3.dot(D)
CalculatedPoints = np.add(startpoints,eq4)
print('new startpoints',CalculatedPoints)
newy = []
for i in x:
newy.append(CalculatedPoints[0]*(1-pow(e,-i*CalculatedPoints[1])))
fig, axs = plt.subplots()
axs.scatter(x, y)
axs.plot(x, newy)
fig.suptitle('Gauss - Newton')
plt.show()
GaussNewtonMethod([1,1])
Мой ответ:
new startpoints [0.72852264 1.50193087] // this the true one
new startpoints [0.7910431 1.17577025]
new startpoints [0.76868865 1.46238863]
new startpoints [0.79016327 1.20404379]
new startpoints [0.77254469 1.43636334]
для получения дополнительной информации о моих расчетах
График вопроса: