ValueError: операнды не могут быть переданы вместе с ошибкой shape (100,) (99,) в Python - PullRequest
0 голосов
/ 09 июля 2020

Я использую решатель bvp в Python для решения краевой задачи 4-го порядка. Фактические уравнения не показаны, чтобы избежать дальнейшей сложности. Код, который я написал для того же самого, был прикреплен ниже.

import numpy as np
from scipy.integrate import solve_bvp
import matplotlib.pyplot as plt

def xmesh(k1):      # xmesh definition
 return np.linspace(0,L,k1)

def solveit(constant):
   
   def fun(x,y):             # this function returns all the derivatives of y(x)
    array=np.empty(100,)     # array is an 1-D array
    array.fill(1)
    def array_function():
        return array     
    var= array_function()    # var is an 1-D array
    rhs= var+y[0]            # rhs is an 1-D array
    return [y[1],y[2],y[3],rhs]

   def bc(ya,yb):            # boundary conditions 
    return np.array([ya[0],ya[1],yb[0],yb[1]])
  
   init= np.zeros((4,len(xmesh(100))))       # initial value for the bvp solver
   sol= solve_bvp(fun,bc,xmesh(100),init,tol=1e-6,max_nodes=5000)
   arr= sol.sol(xmesh(100))[0] 
   return arr
arr= solveit(0.1)

Я сталкиваюсь со следующей ошибкой: operands could not be broadcast together with shapes (100,) (99,) каждый раз, когда я пытаюсь запустить приведенный выше код. Трассировка стека вышеуказанной ошибки также прилагается ниже.

ValueError                                Traceback (most recent call last)
<ipython-input-52-62db777e3281> in <module>()
     24    arr= sol.sol(xmesh(100))[0]
     25    return arr
---> 26 arr= solveit(0.1)

6 frames
<ipython-input-52-62db777e3281> in solveit(constant)
     21 
     22    init= np.zeros((4,len(xmesh(100))))       # initial value for the bvp solver
---> 23    sol= solve_bvp(fun,bc,xmesh(100),init,tol=1e-6,max_nodes=5000)
     24    arr= sol.sol(xmesh(100))[0]
     25    return arr

/usr/local/lib/python3.6/dist-packages/scipy/integrate/_bvp.py in solve_bvp(fun, bc, x, y, p, S, fun_jac, bc_jac, tol, max_nodes, verbose, bc_tol)
   1084                                        fun_jac_wrapped, bc_jac_wrapped, x, h)
   1085         y, p, singular = solve_newton(n, m, h, col_fun, bc_wrapped, jac_sys,
-> 1086                                       y, p, B, tol, bc_tol)
   1087         iteration += 1
   1088 

/usr/local/lib/python3.6/dist-packages/scipy/integrate/_bvp.py in solve_newton(n, m, h, col_fun, bc, jac, y, p, B, bvp_tol, bc_tol)
    439     n_trial = 4
    440 
--> 441     col_res, y_middle, f, f_middle = col_fun(y, p)
    442     bc_res = bc(y[:, 0], y[:, -1], p)
    443     res = np.hstack((col_res.ravel(order='F'), bc_res))

/usr/local/lib/python3.6/dist-packages/scipy/integrate/_bvp.py in col_fun(y, p)
    324 
    325     def col_fun(y, p):
--> 326         return collocation_fun(fun, y, p, x, h)
    327 
    328     def sys_jac(y, p, y_middle, f, f_middle, bc0):

/usr/local/lib/python3.6/dist-packages/scipy/integrate/_bvp.py in collocation_fun(fun, y, p, x, h)
    311     y_middle = (0.5 * (y[:, 1:] + y[:, :-1]) -
    312                 0.125 * h * (f[:, 1:] - f[:, :-1]))
--> 313     f_middle = fun(x[:-1] + 0.5 * h, y_middle, p)
    314     col_res = y[:, 1:] - y[:, :-1] - h / 6 * (f[:, :-1] + f[:, 1:] +
    315                                               4 * f_middle)

/usr/local/lib/python3.6/dist-packages/scipy/integrate/_bvp.py in fun_p(x, y, _)
    648     if k == 0:
    649         def fun_p(x, y, _):
--> 650             return np.asarray(fun(x, y), dtype)
    651 
    652         def bc_wrapped(ya, yb, _):

<ipython-input-52-62db777e3281> in fun(x, y)
     14         return array
     15     var= array_function()    # var is an 1-D array
---> 16     rhs= var+y[0]            # rhs is an 1-D array
     17     return [y[1],y[2],y[3],rhs]
     18 

ValueError: operands could not be broadcast together with shapes (100,) (99,) 

Как следует из ошибки, она возникает, потому что я пытаюсь выполнить некоторые математические операции с двумя массивами разных размеров. Но я не понимаю, почему эта ошибка вообще возникает здесь, учитывая, что все массивы, определенные выше, имеют одинаковую форму (100,). Мы будем очень признательны за любое исправление вышеуказанной проблемы. Я застрял с этой ошибкой в ​​течение некоторого времени.

PS - Функции, которые я определил в приведенном выше коде, не имеют физического значения и полностью случайны . Приведенный выше код - это просто упрощенная c версия довольно сложного кода, который я написал. Итак, мне не нужно правильное численное решение приведенного выше кода. Все, что мне нужно, это код, чтобы он работал без ошибок. Кроме того, я ранее успешно использовал решатель bvp в Python.

1 Ответ

1 голос
/ 09 июля 2020

Когда я использую print(x.shape, y[0].shape), то в какой-то момент оба меняют размер на 99, и я думаю, вы должны использовать x.shape для создания array

 array = np.empty(x.shape,) # array is an 1-D array

И это работает для меня. Но я не знаю, дает ли это ожидаемые результаты.

Кстати: Позже я увидел x.shape, y[0].shape может изменить размер даже на 3564

import numpy as np
from scipy.integrate import solve_bvp
import matplotlib.pyplot as plt

L = 100

def xmesh(k1):
    """xmesh definition"""
    return np.linspace(0, L, k1)

def solveit(constant):
   
    def fun(x, y):             
        """returns all the derivatives of y(x)"""
        array = np.empty(x.shape,) # array is an 1-D array
        array.fill(1)
        rhs = array + y[0]         # rhs is an 1-D array
        return [y[1], y[2], y[3], rhs]
    
    def bc(ya, yb):
        """boundary conditions"""
        return np.array([ya[0], ya[1], yb[0], yb[1]])
      
    init = np.zeros((4, len(xmesh(100))))       # initial value for the bvp solver
    sol = solve_bvp(fun, bc, xmesh(100), init, tol=1e-6, max_nodes=5000)
    arr = sol.sol(xmesh(100))[0]
    
    return arr
    
arr = solveit(0.1)
...