Я пытаюсь создать симуляцию, содержащую суммирование с подходящим параметром m.
например, если я добавляю значение m = 1, я могу составить до 70 сумм, но если я добавляю m = 5, я могу составить только 19 сумм. и появляется эта ошибка.
TypeError: вывод ufunc 'add' (типовой код 'O') не может быть приведен к предоставленному выходному параметру (типовой код 'd') в соответствии с правилом приведения ''same_kind''
Мой код выглядит следующим образом
from scipy.special import factorial2
m = 5
theta = np.linspace(0, 1.5, 100)
def I(n):
it = 0
for t in range(n+1):
it += ((2**t)*(m**t)*(np.cos(theta)**(2*t)))/factorial2(2*t+1)
return it
Itheta= I(20)
Я попытался выяснить, связана ли ошибка с оператором факториала, но если вы удалите его из цикла, ошибка останется.
Я обнаружил, что это from scipy.special import factorial2
. Чтобы исправить ошибку, замените it = 0
на it = np.zeros(100)
.
да factorial2
происходит из этой библиотеки. ну, я просто пытаюсь сделать, как вы сказали, подставив 't = 0', но не сработало
Была еще одна причуда с оператором +=. Будьте осторожны с этим. Вдогонку к моим комментариям:
from scipy.special import factorial2
import numpy as np
m = 5
theta = np.linspace(0, 1.5, 100)
def I(n):
it = np.zeros(100)
for t in range(n+1):
it = it + ((2**t)*(m**t)*(np.cos(theta)**(2*t)))/factorial2(2*t+1)
return it
Itheta = I(20)
print(Itheta)
Интересное видео, я использую Python каждый день и никогда особо не задумывался +=
.
Ошибка больше не возникает следующим образом (т.е. не используйте it += ..
).
def I(n):
it = 0
for t in range(n+1):
it = it + ((2**t)*(m**t)*(np.cos(theta)**(2*t)))/factorial2(2*t+1)
return it
Интересно, что it += ..
не приводит к ошибке при использовании следующих шагов.
def I(n):
it = 0
for t in range(n+1):
a = 2**t
b = m**t
c = np.cos(theta)**(2*t)
d = factorial2(2*t+1)
it += a*(b*c)/d
return it
К сожалению, я не могу объяснить вам, почему это так.
Я просто вижу, что у @Tempman383838 может быть объяснение этому (хотя мне любопытно, почему тогда работает мой второй пример).
Что делает функция
factorial2
? Не могли бы вы обновить свой пост до MRE?