Python:定义一个函数来计算sin(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}.FormatFloatProximation\u sinx\u flt 提示: 为rangen添加一个值。十次迭代将是一个良好的开端。 对于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
假设这是一个无穷级数,您可以创建一个生成器,给定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仍然无法找到正确答案。不太清楚为什么。无论如何,帕特里克·豪有一个聪明的解决方案。