#python #numpy #scipy #integral
Вопрос:
Я пытаюсь вычислить определенный интеграл матрицы 2*10. Мне нужно вычислить его определенный интеграл от нуля до t, поскольку мы знаем, что результаты должны совпадать с таблицей синусов.
Вот код перед достижением цели выдает ошибку. Ошибка, вероятно, относится к последним строкам.
Я был бы так благодарен, если бы вы направили меня, пожалуйста.
import numpy as np
import math
import matplotlib.pyplot as plt
from scipy import integrate
from scipy.integrate import quad
from numpy import linalg as LA
from numpy.linalg import matrix_power
from scipy import linalg
from sympy import *
import scipy.integrate as it
from numpy import vectorize
############
from numba import vectorize, float64
##############################
# Constants
tmax = 20
t = np.arange(0.0, tmax, 1)
t0=0
m=len(t)
#print(t)
etest=np.matrix([[np.sqrt(0),np.sqrt(1),np.sqrt(2) ,np.sqrt(3),np.sqrt(4),np.sqrt(5),np.sqrt(6),np.sqrt(7),np.sqrt(8),np.sqrt(9)],
[np.sqrt(10),np.sqrt(11),np.sqrt(12), np.sqrt(13),np.sqrt(14),np.sqrt(15),np.sqrt(16),np.sqrt(17),np.sqrt(18),np.sqrt (19)]])
pow = np.power( etest, 2 )
pow0=pow[0]
pow1=pow[1]
def norm2etest(xx):
sum= pow0 pow1
return sum
ans2=norm2etest(etest)
print(ans2)
def outerfun(norm2etest):
return np.cos(norm2etest)
def integrandtest(xx):
return outerfun(norm2etest(xx))
ttt=outerfun(norm2etest(etest))
#print(ttt)
for tnow in np.arange(0.0, tmax, 1):
numnow=1*tnow
num=np.array(numnow,dtype=int)
@np.vectorize
def integratetest(i):
def integrandtest(t):
return outerfun(norm2etest(t))[i]
I, ff = quad(integrandtest, t0,tnow)
return I
###########################
INTERVALtest=np.arange(0,10)
ANS1=integratetest(INTERVALtest)
print(INTERVALtest)
#print(ANS1.size)
выдает эту ошибку
Traceback (most recent call last):
File "C:UsersuserOneDriveDesktop44integral.py", line 58, in <module>
ANS1=integratetest(INTERVALtest)
File "C:UsersuserAppDataLocalProgramsPythonPython37libsite-packagesnumpylibfunction_base.py", line 2163, in __call__
return self._vectorize_call(func=func, args=vargs)
File "C:UsersuserAppDataLocalProgramsPythonPython37libsite-packagesnumpylibfunction_base.py", line 2241, in _vectorize_call
ufunc, otypes = self._get_ufunc_and_otypes(func=func, args=args)
File "C:UsersuserAppDataLocalProgramsPythonPython37libsite-packagesnumpylibfunction_base.py", line 2201, in _get_ufunc_and_otypes
outputs = func(*inputs)
File "C:UsersuserOneDriveDesktop44integral.py", line 54, in integratetest
I, ff = quad(integrandtest, t0,tnow)
File "C:UsersuserAppDataLocalProgramsPythonPython37libsite-packagesscipyintegratequadpack.py", line 352, in quad
points)
File "C:UsersuserAppDataLocalProgramsPythonPython37libsite-packagesscipyintegratequadpack.py", line 463, in _quad
return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
TypeError: only size-1 arrays can be converted to Python scalars
Комментарии:
1. Одним из аргументов является массив, когда он должен быть скаляром (или, по крайней мере, массивом из одного элемента). Мне пришлось бы потратить больше времени на изучение кода, но мое первое предположение-это границы этого интеграла. Избавьтесь от этого
np.vectorize
декоратора и выполните простую итерацию pythont
. Это не помогает со скоростью (ЧИТАЙТЕ ДОКУМЕНТЫ) и может привести к ошибкам.2. Спасибо за ваш ответ. Да, это работает в одном коде, и здесь это не работает. Как я могу сформировать еще одну итерацию на t? у вас есть какая-нибудь идея или пример, в котором интеграл рассматривается как вектор?
3. quad интегрирует скалярное значение
4. Итак, для интеграции массива какая команда более подходящая?
5. На самом деле, я предполагал, что это позволит интегрировать каждый компонент этого массива, каждый раз это фиксированное число. Но ошибка именно в этом, поэтому, если есть команда, которая принимает интеграл от всего массива