Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Como obter a soma parcial de uma sequência aritmética de n termos?

0 votos
24 visitas
perguntada Out 17 em Ciência da Computação por bonfim_tiago (6 pontos)  

Exercício 3.7 do livro "Introduction to Recursive Programming", Página 113

Compartilhe

1 Resposta

0 votos
respondida Out 17 por bonfim_tiago (6 pontos)  
editado Out 18 por bonfim_tiago

O capítulo 3 do referido livro trata de aspectos mais matemáticos da computação, como seria o caso da análise de desempenho de algoritmos. Logo, o exercício selecionado é, essencialmente, matemático.
No referido exercício, solicita-se a demonstração de que a soma parcial nos n primeiros termos de uma sequência aritmética (PA) seria dado pela expressão:

"\("\sum_{i=1}^{n} a_{i} = \frac{n}{2}(a_{1}+a_{n})."\)"

Dada uma PA qualquer, somaremos os n primeiros termos dela. Matematicamente, teremos:

"\("S_{n} = a_1 + a_2 + a_3 + … + a_{n – 2} + a_{n – 1} + a_n"\)"

Logo abaixo dessa soma de termos, escreveremos outra, com os mesmos termos da anterior, porém, no sentido decrescente. Observe que a soma dos termos da primeira é igual à soma dos termos da segunda. Por isso, ambas foram igualadas a "\("S_n"\)".

"\("S_n = a_n + a_{n – 1} + a_{n – 2} + … + a_3 + a_2 + a_1"\)"

Note que essas duas expressões foram obtidas de uma única PA e que os termos equidistantes estão alinhados na vertical. Sendo assim, podemos somar as expressões para obter:

"\("2\times S_n = (a_1 + a_n) + (a_2 + a_{n – 1}) + … + (a_{n – 1} + a_2) + (a_n + a_1)"\)"

Lembre-se de que a soma dos termos equidistantes dos extremos é igual à soma dos extremos. Por isso, cada parênteses pode ser trocado pela soma dos extremos, como faremos a seguir:

"\("2 \times S_n = (a_1 + a_n) + (a_1 + a_n) + ... + (a_1 + a_n) + (a_1 + a_n)"\)"

Nós fizemos de modo que cada termo da PA inicial fosse somado ao seu valor equidistante, preservando seu número de termos. Assim, como a PA tinha n termos, podemos trocar a soma, na expressão acima, por uma multiplicação e resolver a equação para encontrar:

"\("2 \times S_n = (a_1 + a_n) + (a_1 + a_n) + ... + (a_1 + a_n) + (a_1 + a_n)"\)"

"\("2 \times S_n = n(a_1 + a_n)"\)"

"\("S_n = \frac{n(a_1 + a_n)}{2}"\)"

Essa ideia de resolução foi originalmente apresentada por Gauss. Recordo-me dela de muito tempo atrás, um dos motivos pelos quais escolhi essa questão. Mas, adicionalmente, cito aqui, igualmente, a oportunidade por empregar o "\("\LaTeX{}"\)" na resolução, tendo em vista que queria ver como Prorum interpreta e funciona com essa "linguagem".

Agora, segue abaixo uma implementação em Python de um código feito para testar essa fórmula:

def soma_termos_pa(termo_inicial, razao, quantidade_termos):
    an = termo_inicial
    soma = termo_inicial
    for n in range(quantidade_termos-1):
        an += razao
        soma += an
    return soma

# Código de teste
print("Resultado da soma termo a termo: ", soma_termos_pa(2, 2, 6))
print("Resultado da soma pela equação obtida: ", int(6/2*(2+(2+2*(6-1)))))

Com resultado:

Resultado da soma termo a termo: 42
Resultado da soma pela equação obtida: 42

Ou seja, basicamente calculamos a soma da seguinte PA finita:

2, 4, 6, 8, 10, 12

Com "\("a_1 = 2"\)", razão = 2, número de termos (n) = 6 e "\("S_n = 42"\)"

A resolução em si não é complexa, como pode ser vista, e apresenta o gabarito solicitado pelo livro, como pode ser observado!

Até a próxima resolução, pessoal!

comentou Out 19 por Pedro Watuhã (1 ponto)  
Adorei a metodologia utilizada para a resposta por ser muito clássica e também ser algo que me recordo pela demonstração de Gauss. Portanto, acredito que a demonstração matemática baste. Quanto à implementação do código, acredito que a utilização de uma classe para realizar os cálculos da PA pela equação:

class pa():
    #ai é o termo inicial, r a razão e n a quantidade de termos.
    def __init__(self, ai, r):
        self.ai,self.r = float(ai),float(r)
    def nth_term(self,n):
        return (self.ai)+n*r
    def nth_sum(self,n):
        return (n/2)*(2*(self.ai)+(n-1)*(self.r))
    
if __name__=="__main__":
    [ai,r,n]=[2,2,6]
    z = pa(ai,r)
    print(pa.nth_sum(z,n))

Dessa forma inclui-se também o termo if __name__=="__main__", uma etiqueta muito importante de se colocar e obtém-se o mesmo resultado, mas se pode alterar para ver como funcionará para outros valores.
comentou Nov 7 por bonfim_tiago (6 pontos)  
Pedro, boa noite! Todo tranquilo com você?

   Excelentes observações! À luz dos seus comentários, passei a adicionar a linha "if __name__ == __main__" nos meus códigos aqui também. Não vinha fazendo isso nessas questões introdutórias pela sua aparente simplicidade, mas concordo totalmente com você no sentido de que essa é uma boa prática que deveria ser seguida sempre!
   Além disso, sem dúvida que o encapsulamento dessa classe tornaria o código mais fácil de se dar manutenção no futuro, bem como de se reutilizar partes... Considere a solução adotada!


Grande abraço!
...