ValueError: установка элемента массива с последовательностью.Функция может работать в одиночку, но может привести к ошибке при использовании внутри другой функции - PullRequest
0 голосов
/ 26 ноября 2018
def netwon(f, J, p0, tol):
    for i in range(1,51):
        p = p0 - J(p0)/f(p0)
        if la.norm(p - p0) < tol:
            break
        p0 = p
    return p

def JJ(x):
    J = np.identity(4)
    u = sum(x)
    for i in range(0,4):
        for j in range(0,4):
            J[i][j] = J[i][j] + ((np.e**(np.cos(u))) * (np.sin(u)))
    return J

Выдает это сообщение об ошибке при вызове ньютона:

netwon(f, JJ, [2.5, 2, 1.4, 9], 1*10**-12)
-
ValueError                                Traceback (most recent call last)
<ipython-input-58-b80f7ad38c88> in <module>()
----> 1 netwon(f, JJ, [2.5, 2, 1.4, 9], 1*10**-12)

<ipython-input-44-ae7c3122a6cf> in netwon(f, J, p0, tol)
      1 def netwon(f, J, p0, tol):
      2     for i in range(1,51):
----> 3         p = p0 - (J(p0)/f(p0))
      4         if la.norm(p - p0) < tol:
      5             break

<ipython-input-53-17a5f32512be> in JJ(x)
      4     for i in range(0,4):
      5         for j in range(0,4):
----> 6             J[i][j] = J[i][j] + ((np.e**(np.cos(u))) * (np.sin(u)))
      7     return J

ValueError: setting an array element with a sequence.

Я могу использовать JJ отлично:

JJ([2.5, 2, 1.4, 9])
array([[1.36222766, 0.36222766, 0.36222766, 0.36222766],
       [0.36222766, 1.36222766, 0.36222766, 0.36222766],
       [0.36222766, 0.36222766, 1.36222766, 0.36222766],
       [0.36222766, 0.36222766, 0.36222766, 1.36222766]])

Может кто-нибудь заметить мою ошибку здесь, яНе понимаю, почему JJ может работать в одиночку, но приводит к ошибке при использовании внутри другой функции.

Спасибо

1 Ответ

0 голосов
/ 26 ноября 2018

Проблема заключается в форме p0 между первой и второй итерациями вашей функции Ньютона.Сначала это одномерный массив (4,), но он переназначается на двумерный массив (4,4).JJ дает сбой, когда ему подают 2-мерный массив, потому что функция sum не сворачивает 2d-массивы в одно значение, а вместо этого 1d-массив.
PS.Я использую фиктивную функцию f, поскольку исходная функция f не предоставляется, однако я предполагаю, что функция f не приведет к изменению формы результирующего p0.

import numpy as np

def f(x):
    return 1

def netwon(f, J, p0, tol):
    for i in range(1,51):
        p = p0 - J(p0)/f(p0)

#        if la.norm(p - p0) < tol:
        if i ==1: #at first iteration, p0 which used to be a (4,) array will be replaced with a (4,4)
            global inspect
            inspect = p
            break
        p0 = p
    return p

def JJ(x):
    J = np.identity(4)
    u = sum(x)
    for i in range(0,4):
        for j in range(0,4):
            J[i][j] = J[i][j] + ((np.e**(np.cos(u))) * (np.sin(u)))
    return J

a = [2.5, 2, 1.4, 9]
netwon(f, JJ, a, 1*10**-12)
#fine till here
print(inspect) #no longer a (4,) array. It is now a (4,4)
print(sum(inspect)) #no longer a single value, but a (4,) array
u = sum(inspect)
((np.e**(np.cos(u))) * (np.sin(u))) #no longer a single value.

# J[i][j] = J[i][j] + ((np.e**(np.cos(u))) * (np.sin(u))) #1 location is now attempting to be assigned with an array
JJ(inspect) #will result in error.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...