Найти - Пользователи
Полная версия: Рекурсия и функция
Начало » Python для новичков » Рекурсия и функция
1
SteamTim
Всех приветствую. Учусь в техникуме и возникла проблема на последних работах. Вот я сделал по своему - училка давит на “не правильно, переделай”. Так вот, уже обращаюсь к вам за помощью. Шаблон для всех тоже прикрепляю.

1) Условие из ШАБЛОНА И САМ ШАБЛОН:
Составить две программы для вычисления суммы ряда с точностью ε, используя функцию. В одной программе реализация функции осуществить итерационным путем, в другой – через рекурсию.
Под приближенными значениями суммы ряда с точностью ε здесь понимается сумма слагаемых, для которых выполняется условие ε. Вот само условие: https://ibb.co/vHD3QsK , где x=0.34, E=0.0001
Само выполнение этой программы:
 #Программа 1 из шаблона:
import math
def factorial_iterative(num:int):
    factorial = 1
    if num < 0:
        return 0
    else:
        for i in range (1, num + 1):
            factorial = factorial*i
        return factorial 
x= float(input('x: '))
eps=float(input('eps:'))
n=1
sum=0
a=(-1)**n*(2*x)/factorial_iterative(2*n)
while math.fabs(a)>eps:
    sum+=a
    n+=1
    a=(-1)**n*(2*x)**n/factorial_iterative(2*n)
print ("suma=",sum)
print("n=",n)
#Программа 2 из шаблона: 
import math
def factorial_recursive(n):
    if n == 1:
        return n
    else:
        return n*factorial_recursive(n-1)
x= float(input('x: '))
eps=float(input('eps:'))
n=1
sum=0
a=(-1)**n*(2*x)/factorial_recursive(2*n)
while math.fabs(a)>eps:
    sum+=a
    n+=1
    a=(-1)**n*(2*x)**n/factorial_recursive(2*n)
print ("suma=",sum)
print("n=",n)

Теперь моё условие (из листочка): https://ibb.co/ZzBPznz , где Х=0,58, Е=0,001. Программу писать примерно по такому же шаблону можно. Честно, господа, за помощь буду безумно благодарен, просто своих сил уже реально нет.
py.user.next
Эпсилон - это точность с которой отличаются частичные суммы. Не модуль элемента надо проверять на эпсилон, а то, насколько новый элемент меняет предыдущую частичную сумму при добавлении к ней.

А модуль члена ряда может никогда и не стать меньше эпсилон.

Поэтому проверять нужно такое условие: abs(sum - (sum - a)) >= eps .

Вот пример синуса
  
#!/usr/bin/env python3
 
# Находит sin(x) через ряд Маклорена
# sin(x) = x - (x ^ 3) / 3! + (x ^ 5) / 5! - (x ^ 7) / 7! + ...
 
import math
 
def sin(x, eps):
    x %= 2 * math.pi
    s = ps = 0
    sl = x
    z = 1
    while True:
        ps = s
        s += sl
        sl = -sl * x * x / (2 * z * (2 * z + 1))
        z += 1
        if abs(s - ps) < eps:
            s = ps
            break
    return s
 
if __name__ == '__main__':
    n = 6
    print('sin digits =', n)
    print(sin(12345, 10 ** -n))
    print(math.sin(12345))
[guest@localhost py]$ ./row_sin.py 
sin digits = 6
-0.9937714417514263
-0.9937716364556811
[guest@localhost py]$

Поправил синус на вариант попроще
  
#!/usr/bin/env python3
 
# Находит sin(x) через ряд Маклорена
# sin(x) = x - (x ^ 3) / 3! + (x ^ 5) / 5! - (x ^ 7) / 7! + ...
 
import math
 
def sin(x, eps):
    x %= 2 * math.pi
    s = 0
    sl = x
    z = 1
    while abs(sl) >= eps:
        s += sl
        sl = -sl * x * x / (2 * z * (2 * z + 1))
        z += 1
    return s
 
if __name__ == '__main__':
    n = 6
    print('sin digits =', n)
    print(sin(12345, 10 ** -n))
    print(math.sin(12345))
[guest@localhost py]$ ./row_sin.py 
sin digits = 6
-0.9937714417514263
-0.9937716364556811
[guest@localhost py]$

Просто это так сразу сходу не очевидно. Но по факту разность частичных сумм - это их член ряда, который прибавлялся к одной частичной сумме, чтобы получить следующую частичную сумму.
SteamTim
py.user.next
Эпсилон - это точность с которой отличаются частичные суммы. Не модуль элемента надо проверять на эпсилон, а то, насколько новый элемент меняет предыдущую частичную сумму при добавлении к ней.А модуль члена ряда может никогда и не стать меньше эпсилон.Поэтому проверять нужно такое условие: abs(sum - (sum - a)) >= eps .Вот пример синуса

Вы что-то не то написали. Я имел ввиду, что на картинке (по ссылке, я на имгур залил) есть моё условие. И его нужно переделать так, как на шаблоне. (Шаблон тоже есть и условие шаблона и сам текст пайтона как результат). Вот мне тоже нужно две программы по шаблонам
py.user.next
SteamTim
Вы что-то не то написали. Я имел ввиду, что на картинке (по ссылке, я на имгур залил) есть моё условие.
Ну… Я имею в виду, что ты его неправильно проверяешь. Мало того что проверяешь неправильно, так ещё и сумму ряда условием называешь. То есть ты даже не понимаешь, что ты делаешь и что нужно сделать.

Сумма ряда условием не является. Сумма ряда - это сокращённая запись числового ряда, который в конечном итоге складывается и образует сумму, которая является одним числом. И это будет либо число, либо бесконечность. Если число - ряд сходится, если бесконечность - ряд расходится.

Когда вместо вот такого числового ряда
1 + 2 + 3 + 4 + 5 + ... + бесконечность
Это всё записывается в сокращённом виде

1 + 2 - это частичная сумма, она равна 3.
1 + 2 + 3 - это частичная сумма, она равна 6.
1 + 2 + 3 + 4 - это частичная сумма, она равна 10.
А ряд сам бесконечный. Его сумма равна бесконечности.

Дальше ты приводишь код. Я смотрю в этот код и вижу, что он написан неправильно. Эпсилон проверяется неправильно. И я тебе объясняю, как нужно проверять эпсилон и привожу пример, в котором эпсилон правильно проверяется, чтобы ты посмотрел и сделал выводы про свои коды.
py.user.next
Что-то я посчитал… Похоже, действительно, можно abs(sum - (sum - a)) >= eps привести к виду abs(a) >= eps.
Типа это одно и то же получается.
py.user.next
SteamTim
Теперь моё условие (из листочка): https://ibb.co/ZzBPznz , где Х=0,58, Е=0,001. Программу писать примерно по такому же шаблону можно. Честно, господа, за помощь буду безумно благодарен, просто своих сил уже реально нет.
Ты знаешь, эта фигня делается через рекуррентные соотношения. То есть ты должен взять член ряда для n и член ряда для (n + 1). Потом вот этот член ряда для (n + 1) надо поделить на член ряда для n. Тогда у тебя получится формула для вычисления одного члена ряда через предыдущий член ряда. Получится такая хрень, короче, на которую можно умножить любой член ряда, чтобы получить следующий за ним член ряда. И вот таким макаром это делается. Поэтому факториалы не надо вычислять. Надо найти этот коэффициент, на который умножается член ряда, чтобы получить следующий член ряда. И потом через этот коэффициент надо вычислять частичную сумму ряда для такого-то члена, пока разность этой частичной суммы и предыдущей частичной суммы не станет меньше эпсилон.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB