Я хочу минимизировать следующую функцию J (u) = 0,5 * лямбда * | u-uap | ^ 2, используя метод градиента с постоянным p-шагом, и для этого я пишу следующие строки кода в Python.
import numpy as np
import os
# Définition de la fonctionnelle J
#def J(y,uap):
# u1,u2,u3,u4 = y
# u = np.array([u1,u2,u3,u4])
# #uap = np.array([-0.8811745 , 241.88383317, 40.0355949 , 77.24687151])
# return (1 / 2)*np.abs(u-uap)**2
def DuJu (y,uap,lbda):
u1,u2,u3,u4 = y
u = np.array([u1,u2,u3,u4])
return lbda*np.array((u-uap))
Nt = 100
tgrid, dt = np.linspace(0, 200, num=Nt, retstep=True)
uaprox = np.array([-0.8811745 , 241.88383317, 40.0355949 , 77.24687151])
#Algorithme du gradient
theta_iter = np.array([0.0,0.0,0.0,0.0])# Initialisation u0
err = np.array([0.0,0.0,0.0,0.0])
rho = 0.05 #rho
lam = 0.1
while err.all()<10**(-7):
theta_iter -=rho*(DuJu(theta_iter,uaprox,lam)).sum() # uk+1 = uk - rho * DuJu
err = np.abs(theta_iter).sum() # ||uk+1 - uk||
os.system('cls')
print(theta_iter)
print(err)
, где u - вектор R ^ 4 и uap = (-0.8811745, 241.88383317, 40.0355949, 77.24687151) и при выполнении кода я получаю следующие результаты:
[1.79142563 1.79142563 1.79142563 1.79142563]
7.165702501600001
Каждый раз, когда я изменяю параметры, я получаю равные значения в каждом компоненте вектора u, и я не знаю, в чем заключается ошибка в алгоритме.
Не могли бы вы помочь мне определить ошибку или другим способом? реализовать алгоритм градиента с постоянным шагом rho?