Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:定义一个函数来计算sin(x)_Python_Python 3.x - Fatal编程技术网

Python:定义一个函数来计算sin(x)

Python:定义一个函数来计算sin(x),python,python-3.x,Python,Python 3.x,我必须定义一个计算sin的函数,程序将展开序列,直到序列中下一项的绝对值小于1.0e-7,使用以下表达式: 这就是我目前所得到的,但我知道这还远远不够: 编号=输入\n\t输入X: x_flt=浮点数 x_int=intx_flt x_约等于0 对于范围为1的i,x_int+1: 系数=x_flt*i def近似值\u sinx: '在此处插入文档字符串。' 对于范围内的某个对象: x_近似值=-1**a*x**2*a+1/系数 返回x_近似值 打印\n\t程序:{:.10f}.FormatFl

我必须定义一个计算sin的函数,程序将展开序列,直到序列中下一项的绝对值小于1.0e-7,使用以下表达式:

这就是我目前所得到的,但我知道这还远远不够:

编号=输入\n\t输入X: x_flt=浮点数 x_int=intx_flt x_约等于0 对于范围为1的i,x_int+1: 系数=x_flt*i def近似值\u sinx: '在此处插入文档字符串。' 对于范围内的某个对象: x_近似值=-1**a*x**2*a+1/系数 返回x_近似值 打印\n\t程序:{:.10f}.FormatFloatProximation\u sinx\u flt 提示:

为rangen添加一个值。十次迭代将是一个良好的开端。 对于x_近似值,使用+=代替=。 也许你可以看看这些文件。
假设这是一个无穷级数,您可以创建一个生成器,给定x,通过每次递增n来提供下一个求值

from math import factorial, pow

def sin_gen(x):
    n = 0
    while True:
        result = (pow(-1, n) * pow(x, (2 * n + 1))) / factorial(2 * n + 1)
        yield result
        n += 1
现在您只需要对每个评估求和,直到总数达到您想要的值

g = sin_gen(x)
total = 0

for val in g: 
    if abs(val) < 1.0e-7: 
        break 
    total += val

print(total)
小心-1**n,它没有像您预期的那样被解析。**绑定比一元数更紧密-具有更高的优先级,因此此表达式的解析方式类似于-1**n。类似于Blueteiths解决方案,我会做如下操作

from math import factorial, pow
from itertools import takewhile, count

large = lambda y: abs(y) > 1e-7

def sin_gen(x):
    for n in count():
        yield (pow(-1, n) * pow(x, (2 * n + 1))) / factorial(2 * n + 1)


def sin(x):
    return sum(takewhile(large, sin_gen(x)))

print(sin(5))  # -0.9589242932128198

我会这样做,它使用公式,但不是直接的

-1**n是上一个值乘以-1。 x**2n+1是上一个值乘以x*x。 2n+1!是前一个值乘以2n*2n+1。 这意味着您的循环不进行幂或阶乘计算,这会更有效一些。这是Python的版本:

def近似值,eps=1e-7: 术语=x 两个n=0 总数=0 当absterm>=eps时: 总数+=期限 2_n+=2 术语*=-x*x/two_n*two_n+1 返回总数
您预计这将在何时停止,即您在哪里将任何东西与1.0e-7进行比较?您的内部范围调用可能不符合您的要求-相反,请尝试使用while之类的方法并保持以前的近似值,来跟踪每次迭代的近似值更改量。对于范围内的调用:由于范围至少需要一个参数,因此会给出一个错误。如前所述,您可能需要一个while循环,该循环在最后一个术语<1e-7时停止。@kaya3这就是我试图用val做的事情。在这种情况下我总是很困惑。我觉得这样更好?@kaya3仍然无法找到正确答案。不太清楚为什么。无论如何,帕特里克·豪有一个聪明的解决方案。