1import numpy as np
2import numpy.linalg as npla
3from numpy import pi, sin, cos
4
5
6n = 10
7h = 1./n
8xx = np.linspace(0., 1., n+1)
9
10
11ua = 0.
12ub = 0.
13
14def f(x, u, ux):
15 return u*ux - pi*sin(pi*x)*(pi + cos(pi*x))
16
17def fu(x, u, ux):
18 return ux
19
20def fux(x, u, ux):
21 return u
22
23
24def F(u):
25 y = np.empty(n+1)
26
27 y[0] = u[0] - ua
28
29 for i in range(1,n):
30 ux = u[i+1]/(2*h) - u[i-1]/(2*h)
31 y[i] = -1./h**2*u[i-1] + 2./h**2*u[i] - 1./h**2*u[i+1] \
32 + f(xx[i], u[i], ux)
33
34 y[n] = u[n] - ub
35
36 return y
37
38
39def J(u):
40 J = np.zeros((n+1,n+1))
41 J[0,0] = 1.
42 for i in range(1,n):
43 ux = 1./(2*h)*u[i+1] - 1./(2*h)*u[i-1]
44 J[i,i-1] = -1./h**2 - 1/(2*h)\
45 * fux(xx[i], u[i], ux)
46 J[i,i] = 2/h**2 + fu(xx[i], u[i], ux)
47 J[i,i+1] = -1./h**2 + 1/(2*h)\
48 * fux(xx[i], u[i], ux)
49 J[n,n] = 1.
50
51 return J
52
53
54u = np.zeros(n+1)
55
56
57maxiter = 10
58for k in range(maxiter):
59
60
61 dlta = npla.solve(J(u), -F(u))
62
63
64 u += dlta
65
66 ndlta = npla.norm(dlta)
67 print(f'{k+1}: norm = {ndlta:.2e}')
68 if (ndlta < 1e-10):
69 print('convergiu.')
70 break