我正在尝试编写一个程序,以x n + 1 = x n 2 + c的形式为我迭代。我该怎么做?
例如,对于c = 1且x 0 = 1/2
(1/2) 2 + 1 = 5/4,
(5/4) 2 + 1 = 25/16 + 1 = 41/16
......等等。
我的代码在这里不起作用:
def main():
import math
print("This program iterates a function of the form x^2 + c:")
x=complex(input("Enter a seed value:"))
c=complex(input("Enter a value for c"))
for i in range(50):
f(0) = x*x + c
f(i) = f(i-1)*f(i-1) + c
print(f(i))
main()
Python不允许我像matlab一样使用f(0)
或f(i)
,还有什么替代方案?
答案 0 :(得分:2)
Tabbing在python中至关重要,请尝试下面的代码。这是一个很长的镜头来猜测你的意图是什么,但它会让你更接近最终结果
def main(x):
import math
print("This program iterates a function of the form x^2 + c:")
c = complex(input("Enter a value for c"))
print "C : %s" % c
f = [x * x + c]
for i in range(1, 50):
f.append(f[i - 1] * f[i - 1] + c)
print f
main(2)
答案 1 :(得分:2)
如果您对保留所有部分结果不感兴趣,可以这样迭代:
import math
print("This program iterates a function of the form x^2 + c:")
x = complex(input("Enter a seed value:"))
c = complex(input("Enter a value for c"))
f = x * x + c
for _ in range(50):
f = f * f + c
print(f)
答案 2 :(得分:1)
让我们调用你的函数f
:
def f(x, c):
return x * x + c
然后在main()
中你可以这样称呼它:
def main():
n = complex(input("Enter a seed value: "))
c = complex(input("Enter a value for c: "))
print n
for term in range(50):
n = f(n, c)
print n
每次迭代时,n
都会重新分配给f
的返回值,前值为n
。
答案 3 :(得分:1)
Python中有一种称为生成器函数的特殊机制。它返回一个记住最后一个状态的对象,并使用前一个调用的值(迭代器)执行函数体。
仅通过使用yield
命令而不是return
在语法上与正常功能不同。您通常可以在期望迭代器的位置使用这样的生成器函数,即for-loop,容器构造函数等。请参阅代码:
def f(x, c, n=5):
while n > 0:
yield x # returns x0 as first value
x = x * x + c # this value is to be returned next time
n -= 1 # decrement the sequence counter
# Using the generator function in a for loop.
for value in f(1/2, 1, 14): # I want 14 members of the sequence
print(value)
# Using the generator function to build a list of the values.
print('----------------------------------')
lst = list(f(1/2, 1, 10)) # 10 members wanted here
print(lst)
# Using the standard module called fractions for the same function.
print('==================================')
from fractions import Fraction as frac
# Using the generator function in a for loop.
for value in f(frac(1, 2), 1): # default number of loop used here
print(value)
# Using the generator function to build a list of the values.
print('----------------------------------')
lst = list(f(frac(1, 2), 1, 10)) # 10 members wanted here
print(lst)
# Generating Mandelbrot set values.
print('==================================')
# Using the generator function in a for loop.
for value in f(complex(0), complex(0, 1)): # default number of loop used here
print(value)
Python不会像matlab那样以符号方式计算表达式。但是,它具有标准模块分数,其具有Fraction类来表示分数。您也可以为该类型使用相同的生成器函数,因为它定义了自己的乘法和加法。由于Python整数的限制不如浮点数,因此使用分数可能会获得更大的结果(如果它完全有意义的话)。但你可能想要生成一个Mandelbrot集,对吗?
它显示在我的控制台上(包裹的线条):
0.5
1.25
2.5625
7.56640625
58.25050354003906
3394.1211626681034
11520059.466871478
132711770120256.16
1.7612413928451715e+28
3.1019712438712e+56
9.62222559780384e+112
9.258722545503146e+225
inf
inf
----------------------------------
[0.5, 1.25, 2.5625, 7.56640625, 58.25050354003906, 3394.1211626681034, 11520059.
466871478, 132711770120256.16, 1.7612413928451715e+28, 3.1019712438712e+56]
==================================
1/2
5/4
41/16
1937/256
3817505/65536
----------------------------------
[Fraction(1, 2), Fraction(5, 4), Fraction(41, 16), Fraction(1937, 256), Fraction
(3817505, 65536), Fraction(14577639392321, 4294967296), Fraction(212507588699293
047863318657, 18446744073709551616), Fraction(4515947525478824258458249067737177
3490882293292495105, 340282366920938463463374607431768211456), Fraction(20393782
05287831607501825305820853979646214602081433287459323242821411496740800167480972
336912829578600961, 115792089237316195423570985008687907853269984665640564039457
584007913129639936), Fraction(41590634642030170391815210870941032988232016881852
69467060076200306147021769623813726880369383179868466442311933392597163786089664
61843166606956164602440721448188927878363156181727061624343416854647005907620761
7, 13407807929942597099574024998205846127479365820592393377723561443721764030073
546976801874298166903427690031858186486050853753882811946569946433649006084096)]
==================================
0j
1j
(-1+1j)
-1j
(-1+1j)
答案 4 :(得分:0)
美好的一天。
# x_(n+1) = x_(n)^2 + c
def f(n,c):
a=0
while a < n:
a +=1
yield a * a + c
现在你可以使用f作为生成器
if __name__ == '__main__':
for element in f(100, 0):
print element