Найти - Пользователи
Полная версия: Тригонометрические функции. Не могу понять почему такой вывод
Начало » Python для новичков » Тригонометрические функции. Не могу понять почему такой вывод
1
rudm
Простая функция, которая выводит члены последовательности
(sinx - cosx)/x до тех пор пока последний элемент не становится меньше 0.01

import math

def calc():

x = 1

sinx = math.sin(x)
cosx = math.cos(x)

while (sinx - cosx)/x > 0.01:

print(x, (sinx - cosx)/x)
x += 1

def check():

x = 1
sinx = math.sin(x)
cosx = math.cos(x)
print("x is", x)
print("sinx is", sinx, "cosx is", cosx)
print("(sinx - cosx) is", sinx - cosx)
print("(sinx - cosx)/x is", (sinx - cosx)/x)

print("---Start calc()---")
calc()
print("---Start check()---")
check()

Что касается первого элемента, то вроде бы все верно
Вывод:
---Start calc()---
1 0.30116867893975685
2 0.15058433946987843
3 0.10038955964658562
4 0.07529216973493921
5 0.06023373578795137
6 0.05019477982329281
7 0.04302409699139383
8 0.037646084867469606
9 0.03346318654886187
10 0.030116867893975684
11 0.02737897081270517
12 0.025097389911646405
13 0.023166821456904373
14 0.021512048495696916
15 0.020077911929317124
16 0.018823042433734803
17 0.017715804643515107
18 0.016731593274430936
19 0.015850983102092465
20 0.015058433946987842
21 0.014341365663797945
22 0.013689485406352585
23 0.01309429038868508
24 0.012548694955823203
25 0.012046747157590274
26 0.011583410728452186
27 0.01115439551628729
28 0.010756024247848458
29 0.010385126859991616
30 0.010038955964658562
---Start check()---
x is 1
sinx is 0.8414709848078965 cosx is 0.5403023058681397
(sinx - cosx) is 0.30116867893975685
(sinx - cosx)/x is 0.30116867893975685

Но если в функции check() изменить x = 2
То вывод:

---Start calc()---
1 0.30116867893975685
2 0.15058433946987843
3 0.10038955964658562
4 0.07529216973493921
5 0.06023373578795137
6 0.05019477982329281
7 0.04302409699139383
8 0.037646084867469606
9 0.03346318654886187
10 0.030116867893975684
11 0.02737897081270517
12 0.025097389911646405
13 0.023166821456904373
14 0.021512048495696916
15 0.020077911929317124
16 0.018823042433734803
17 0.017715804643515107
18 0.016731593274430936
19 0.015850983102092465
20 0.015058433946987842
21 0.014341365663797945
22 0.013689485406352585
23 0.01309429038868508
24 0.012548694955823203
25 0.012046747157590274
26 0.011583410728452186
27 0.01115439551628729
28 0.010756024247848458
29 0.010385126859991616
30 0.010038955964658562
---Start check()---
x is 2
sinx is 0.9092974268256817 cosx is -0.4161468365471424
(sinx - cosx) is 1.325444263372824
(sinx - cosx)/x is 0.662722131686412
То есть, совершенно различные значения. Для 2 элемента последовательности (sin 2 - cos 2)/2 = 0.66
Функция calc() выводит значение 0.15058433946987843, что неверно. Хотя, код на мой взгляд одинаковый. Подскажите пожалуйста, в чем может быть проблема?
bismigalis
rudm
sinx = math.sin(x)
cosx = math.cos(x)
нафига это?
FishHook
rudm,
может я понял неправильно, но вроде как Вы ожидаете, что при изменении х в цикле
x += 1
вы ожидаете, что синхронно изменятся значения sinx и cosx
правильно?
rudm
2FishHook
>вы ожидаете, что синхронно изменятся значения sinx и cosx
>правильно?
Да, верно. Очевидно, я не вижу какую то ошибку в коде. Или неверное понимаю принцип работы программы.
bismigalis
чтобы работало надо так
from math import cos, sin
def calc():
    x = 1
    
    while (sin(x) - cos(x))/x > 0.01:
        
        print(x, (sin(x) - cos(x))/x)
        x += 1

py.user.next
>>> import itertools as itools
>>> import operator as op
>>> import math
>>> 
>>> g = ((x, (math.sin(x) - math.cos(x)) / x) for x in itools.count(1))
>>> it = itools.takewhile(lambda y: op.itemgetter(1)(y) >= 0.01, g)
>>> 
>>> for x, y in it:
...     print(x, y)
... 
1 0.30116867893975674
2 0.662722131686412
3 0.3770375015534375
>>>
rudm
Хм, что то не вижу разницы между
import math
math.sin(x)
math.cos(x)
и
from math import cos, sin
sin(x)
cos(x)

Хотя, мой код не работает, а этот работает. Но в таком случае, почему работает код функции check()? Получается, больше вопросов чем ответов.
Даже не знал о модуле itertools - он решает множество проблем. Всем спасибо за конструктивную помощь.


bismigalis
потому что sinx и cosx не меняются в цикле, чтоб работало, надо продублировать их присвоение в цикле
rudm
Спасибо, при внимательном взгляде, разобрался. Благодарю за помощь.
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