Как решить обобщенную c систему нелинейных уравнений с помощью fsolve? - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь решить систему нелинейных уравнений, которая изменяет число переменных и уравнений при изменении n_inputs. В конце мне нужно получить w [i] (для w в диапазоне (n_inputs)) и alfa.

Сначала я сделал это, и оно работало хорошо:

Инициализация переменных wi и бета:

w=[0 for i in range(n_inputs)]
beta=0

Определение альфа:

alfa=np.dot(w,x_M)+beta

Выбор системы по n_inputs:

if n_inputs == 2:
    def f(x):
        w[0],w[1],alfa=x
        f1=sigmoid(alfa)-(sigmoid(alfa)-sigmoid(alfa)**2)*np.dot(w,x_M)-b
        f2=(sigmoid(alfa)-sigmoid(alfa)**2)*w[0]-k[0]
        f3=(sigmoid(alfa)-sigmoid(alfa)**2)*w[1]-k[1]
        return [f1,f2,f3]

elif n_inputs == 3:
    def f(x):
        w[0],w[1],w[2],alfa=x
        f1=sigmoid(alfa)-(sigmoid(alfa)-sigmoid(alfa)**2)*np.dot(w,x_M)-b
        f2=(sigmoid(alfa)-sigmoid(alfa)**2)*w[0]-k[0]
        f3=(sigmoid(alfa)-sigmoid(alfa)**2)*w[1]-k[1]
        f4=(sigmoid(alfa)-sigmoid(alfa)**2)*w[2]-k[2]
        return [f1,f2,f3,f4]

elif n_inputs == 4:
    def f(x):
        w[0],w[1],w[2],w[3],alfa=x
        f1=sigmoid(alfa)-(sigmoid(alfa)-sigmoid(alfa)**2)*np.dot(w,x_M)-b
        f2=(sigmoid(alfa)-sigmoid(alfa)**2)*w[0]-k[0]
        f3=(sigmoid(alfa)-sigmoid(alfa)**2)*w[1]-k[1]
        f4=(sigmoid(alfa)-sigmoid(alfa)**2)*w[2]-k[2]
        f5=(sigmoid(alfa)-sigmoid(alfa)**2)*w[3]-k[3]
        return [f1,f2,f3,f4,f5]

elif n_inputs == 5:
    def f(x):
        w[0],w[1],w[2],w[3],w[4],alfa=x
        f1=sigmoid(alfa)-(sigmoid(alfa)-sigmoid(alfa)**2)*np.dot(w,x_M)-b
        f2=(sigmoid(alfa)-sigmoid(alfa)**2)*w[0]-k[0]
        f3=(sigmoid(alfa)-sigmoid(alfa)**2)*w[1]-k[1]
        f4=(sigmoid(alfa)-sigmoid(alfa)**2)*w[2]-k[2]
        f5=(sigmoid(alfa)-sigmoid(alfa)**2)*w[3]-k[3]
        f6=(sigmoid(alfa)-sigmoid(alfa)**2)*w[4]-k[4]
        return [f1,f2,f3,f4,f5,f6]

elif n_inputs == 6:
    def f(x):
        w[0],w[1],w[2],w[3],w[4],w[5],alfa=x
        f1=sigmoid(alfa)-(sigmoid(alfa)-sigmoid(alfa)**2)*np.dot(w,x_M)-b
        f2=(sigmoid(alfa)-sigmoid(alfa)**2)*w[0]-k[0]
        f3=(sigmoid(alfa)-sigmoid(alfa)**2)*w[1]-k[1]
        f4=(sigmoid(alfa)-sigmoid(alfa)**2)*w[2]-k[2]
        f5=(sigmoid(alfa)-sigmoid(alfa)**2)*w[3]-k[3]
        f6=(sigmoid(alfa)-sigmoid(alfa)**2)*w[4]-k[4]
        f7=(sigmoid(alfa)-sigmoid(alfa)**2)*w[5]-k[5]
        return [f1,f2,f3,f4,f5,f6,f7]

Однако мне нужно обобщить ее для любого значения n_inputs.

Пока я получил это, но мне нужно указать переменные, и я не могу этого сделать.

def f(x):
    w,alfa=x
    f=[sigmoid(alfa)-(sigmoid(alfa)-sigmoid(alfa)**2)*np.dot(w,x_M)-b]
    for i in range(n_inputs):
        f.append((sigmoid(alfa)-sigmoid(alfa)**2)*w[i]-k[i])
    return f

ValueError: слишком много значений для распаковки (ожидается 2)

Может кто-нибудь помочь, пожалуйста?

1 Ответ

0 голосов
/ 08 апреля 2020

Да, вы ожидаете, что python заглянет в ваш мозг, чтобы найти ожидаемое распределение значений.

w,alfa = x[:-1],x[-1]

должно работать.

В принципе, l oop следующее эта строка не обязательна,

f = (sigmoid(alfa)-sigmoid(alfa)**2)*w-k[:n_inputs]

при условии, что x и k являются numpy массивами.

...