|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
import math
def getX3(x0, x1, x2, f0, f1, f2):
x3 = ((f0*(x1**2 - x2**2)+f1*(x2**2-x0**2)+f2*(x0**2-x1**2))/(f0*(x1-x2)+f1*(x2-x0)+f2*(x0-x1)))/2
return x3
def parabolic(x0, x1, x2, maxit, es):
# See x1 as intermediate point
# you can substitute it for (x0 + x2)/2
iter = 1
f0 = f(x0)
f1 = f(x1)
f2 = f(x2)
x3 = getX3(x0, x1, x2, f0, f1, f2)
f3 = f(x3)
xopt = x1
print(" i x0 f(x0) x1 f(x1) x2 f(x2) x3 f(x3)")
print("%2d %.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f" % (iter, x0, f0, x1, f1, x2, f2, x3, f3))
# Suppose We're finding maximum
while True:
x3 = getX3(x0, x1, x2, f0, f1, f2)
f3 = f(x3)
# new point's f value is larger than old intermediate one's
if f3 > f1:
xold = xopt
xopt = x3
if x3 > x1:
x0 = x1
f0 = f1
x1 = x3
f1 = f3
else:
x2 = x1
f2 = f1
x1 = x3
f1 = f3
iter += 1
ea = abs((xopt - xold)/xopt)*0.01
print("%2d %.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f" % (iter, x0, f0, x1, f1, x2, f2, x3, f3))
if iter >= maxit or ea <= es:
print("%.4f is optimal point" % xopt)
break
def f(x):
# Min = 3 :
# return (x**2) - (6*x) + 15
# Max = 1.4274
return 2*math.sin(x) - (x**2)/10
parabolic(0,1,4, 1000,0.00001)
|
cs |
'수학 > 수치해석' 카테고리의 다른 글
| [수치해석] Simple Fixed Point 파이썬 (0) | 2022.12.12 |
|---|---|
| [수치해석] Direct Method 파이썬 (0) | 2022.12.10 |
| [수치해석] Golden Section Method 파이썬 (0) | 2022.12.09 |