Возьмите сигму факториала с неизвестной переменной (используя sympy?)

Добрый день,

Я пытаюсь написать функцию для следующего уравнения:

Eurlang B

Где даны B и N, а я решаю для A.

Я читал, и мне показалось, что симпоть - путь, поэтому я начал объявлять известные переменные, но когда дело дошло до сигма-нотации с факториалом, я понятия не имел, как к ней подойти, так как А неизвестно.

Вот что я придумал:

from sympy import Eq, var, solve
from math import *

A = var('A')
channels = raw_input("Enter the number of channels: ")
#GOS = raw_input("Enter GOS: ")

Sigma = A
for i in range(0,channels+1):
  Sigma += (A**i / factorial(i))

# equation = Eq((A**channels / factorial(channels)) / Sigma) 
# print solve(equation)

что дает мне ошибку TypeError: cannot concatenate 'str' and 'int' objects

Это имеет смысл для меня, но из-за недостатка знаний с sympy я не могу понять, как это исправить.

РЕДАКТИРОВАТЬ: Оглядываясь немного больше, я отредактировал свой код для этого:

  from sympy import *

  A = symbols('A')
  channels = raw_input("Enter the number of channels: ")
  GOS = raw_input("Enter GOS: ")

  Sigma = summation(A**i / factorial(i), (i, 0,channels))
  print Sigma



  # equation = Eq((A**channels / factorial(channels)) / Sigma) 

Теперь я получаю NameError: name 'i' is not defined

Заранее спасибо.

3 ответа

Решение

Во-первых, ошибка (имя "i" не определено) связана с тем, что вы ее не определили. так что вам нужно дать начальное значение для меня.

во-вторых, я пытался заставить вашу программу работать. получил решение без ошибок с этим кодом:

from sympy import *

A = symbols('A')
channels = raw_input("Enter the number of channels: ")
GOS = raw_input("Enter GOS: ")

# note that I convert the string 'channel' to an int
# convert to float if channel could also be a floating number
channels = int(channels) 
Sigma = A
for i in range(0,channels+1):
    Sigma += (A**i / factorial(i))
print Sigma

Результат,

входы: каналы = 3, GOS = 1

выход: A**3/6 + A**2/2 + 2*A + 1

РЕДАКТИРОВАТЬ: Из интереса я начал изучать вашу проблему (также потому, что я мог понять, что этот вопрос не остановится только на проблеме типа данных). Функция Solve имеет 2 входа, уравнение и символ для расчета. он решает уравнение == 0. поэтому переменная B должна быть вычтена из уравнения. (Я предполагал, что входной GOS является переменной B в функции)

equation = (A**channels / factorial(channels)) / Sigma
print(solve(equation-int(GOS), A))

Выполнение кода со строками выше (добавьте их под кодом) дало следующие результаты:

A**3/6 + A**2/2 + 2*A + 1
[-2 - sqrt(2), -2 + sqrt(2)]

Я должен заметить, что если GOS не пересекает функцию, это дает большие результаты с дополнительным параметром I (заглавная i, может указывать на мнимую i). Я надеялся, что это помогло решить вашу проблему.

Чтобы описать аналогичную сумму, как в верхней части страницы, когда я использую рекомендацию asmeurersummation, получаю ошибку -TypeError: 'Symbol' object is not subscriptable." Что может быть возможной причиной этой ошибки? Я импортировал библиотеки ниже. Есть продолжение кода, но я его не добавлял во избежание путаницы .

      import sympy as sympy 
from sympy import *       
from sympy import summation, symbols

class FQ(): 
def integrate(self):
   for k in range(1, self.Nt):
      i = symbols('i', integer=True)
      self.Sigma = summation(self.u[i+1][j], (i, 0, k - 1))

#вторая попытка

      def integrate(self, alpha, Nt, Nx, L):
    
    for k in range(1, self.Nt):   
      for j in range(1, self.Nx-1):  
        #define sum
        for i in range(1, self.Nt):
          Sigma = summation(u[i+1][j], (i, 0, k-1))

Вы также можете выполнить суммирование в SymPy, используя summation функция

i = symbols('i')
summation(A**i/factorial(i), (i, 0, N)

Еще одно замечание: вы начинаете с Sigma = Aэто означает, что ваш конечный результат A + ΣA^i/i! вместо просто ΣA^i/i! (вы можете увидеть в выводе ответа @Petrus1904 есть 2*A вместо A). Если вы хотите использовать цикл для вычисления суммирования, вы должны инициализировать переменную равной 0.

Другие вопросы по тегам