Você está na página 1de 28

x6

6
x

:
<



III
$

V
1

Successive OverRelaxation (SOR)'

Jacobi~
Z

 (S = D)
O
 Gauss-Seidel ~
Z

(S = D + L, T = U )`
O





+
#

4
d

(D + L)xk+1 = ((1 )D U )xk + b


\
[

 \



a\
'
s
O

aA
,
d


y

As


&

rA

r

A'

=
>
s

a
)
.
H 

u



#
0
3
A
H 0 2\

e


.


Q
 _

#
0
3
A
<
j&
_
h
 \

1
H~

Z

\
O
@
/K
"
f




. 
A

<

r'

=
>
d\




\

Jacobi~
Z


O
 Gauss-Seidel ~
Z


O




. 7
,

Ax = b
Ax = ((D + L) (U + (1 )D))x = b
where A = (D + L) (U + (1 )D)

o


P

:
(U + (1 )D)\

rA


l


 SOR~

Z


O
r

6



r
:
.
(D + L)xk+1 = ((1 )D U )xk + b.
\
V\
[

t#

Q, 
6

r A

SOR ~
Z

`
O


(

R

.

!
2 1
A=
e




1 2
SOR ~
Z


O
r

!
2 0
2(1 )

xk+1 =
xk + b`


4


6
x



.
2
0
2(1 )



"
f
4

'

=(L = S 1 T )
>
r

L=

!1
2(1 )

2(1 )

(1 )

/2

(1 )/2 1 + 2 /4

!
.

s

. 
s]
j L_
 eigenvalues


H



(spectral radius)s


j

o
&
H \



.
4

 L_

 eigenvalues_
Y
L

r detL =detT /detSs




detS
< detD
r

M
:
H\

0
A
'

=s
>

@\

eigenvalues_
Y
L

r

1 2 = detL = (1 )2






.
o

n
"
'

=s
>
 

eigenvalues_
 Y
L

r detL = (1

)n s

. 

"
f
4

 Ls


4
l
0
AK
"
f
H |1 | 1 0 2s


.
j&

_
h

H

>
h_
 eigenvalues
`

M

:s
l
M
:
H\


6


s

 &

e


.
1 2
1 + 2 = (opt 1)(opt 1) = 2 2opt + opt
4

(1)

 (1)_

d

t
}

r L_

 trace
< eigenvalues

+
r

M
:
H\


$w

n



. s
d



`


 opt = 4(2 3) 1.07s



r (1/4) 0.07s


a
)
. s



a>
'

Young_

\
d
s





HX

<,
4

 L

 Jocobi~
Z

 D1 (L U )_
O
 eigenvalues

r

6

rd

`

$



n


.
( + 1)2 = 2 2 .

(2)

= 1



, Gauss-Seidel ~
Z

s
O

&
HX

<,

Q
d

 (2)

r 2 = 2 , = 0

o

= 2 
a
)
. Jocobi~
Z

\
O
"
f eigenvalues
H


s


9
1




M
:
H\

, Gauss-Seidel ~
Z

s
O
{

9
&


h

Jocobi~
Z


O

a
~
%
r

~
s
O

a
)
. 0
A_
d
(1)%

!

3

"
s
 2



( 1)( 1) = 2 2opt +

2(1

1 2 )

s
9

"
s
H

'

={
>

9

H0

A
<

r 2


"

'

=_
>
d
`


4

&


h

&

h
6
x




j&

h
H

opt =

2(1

1 2max )

2max


max = opt 1

s

.

6

r SOR ~

`
O
s

6
x


H\

V]
j
<
\
@
/
MATLAB


s

.

dV
U

Q


+

A>

 Ax = b_
K
\
l norm\

"
f_


 104




t
>

H



#

.

ai,j

4,

=
1,

0,

when j = i and i = 1, 2, ..., 16,

j = i + 1 and i = 1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15,

j = i 1 and i = 2, 3, 4, 6, 7, 8, 10, 11, 12, 14, 15, 16,


when

j = i + 4 and i = 1, 2, ..., 12,

j = i 4 and i = 5, 6, ..., 16,


otherwise

and
b

= (1.90, 1.05, 1.17, 3.48, 0.81, 0.26, 0.41, 1.17, 0.91, 0.15,
0.26, 1.05, 1.96, 0.91, 0.81, 1.90).

%%%%%%%%%%%%%%%%%%%%%%%%%%%% SOR.m %%%%%%%%%%%%%%%%%%%%%%%%%%%


clc;clear;
k=0;max_N=1000;stop=0;tol=1.0e-4;n=16;
for i=1:n
for j=1:n
if (j==i)
A(i,j) = 4;
else if ((j==i+1) && (mod(i,4)~=0)) || ...
((j==i-1) && (mod(i,4)~=1)) || ...
((j==i+4) && (i<=12)) || ((j==i-4) &&
(i>=5))
A(i,j) = -1;
else
A(i,j) = 0;
end
end
end

end
b = [1.90; 1.05; 1.17; 3.48; 0.81; -0.26; -0.41; 1.17;
0.91; -0.15; -0.26; 1.05; 1.96; 0.91; 0.81; 1.90];
D=diag(A);
I=ones(n,n);
S=zeros(n,n);
xo=zeros(n,1);
x =zeros(n,1);
for i=1:n
S(i,i)=I(i,i)*D(i);
end
T=A-S;
ST=inv(S)*T;
mu=eig(ST);
max_mu=max(abs(mu));
w_op=(2*(1-sqrt(1-max_mu^2)))/(max_mu^2);
while ((k<max_N)&&(stop==0))
err2=0;
for i=1:n
sum_a1=0;sum_a2=0;
inv_a=1.0/A(i,i);
for j=1:i-1
sum_a1=sum_a1+A(i,j)*x(j);
end
for j=i+1:n
sum_a2=sum_a2+A(i,j)*x(j);
end
x(i)=(1-w_op)*xo(i)+w_op*(-sum_a1-sum_a2+b(i))*inv_a;
end
for i=1:n
err2=err2+abs(xo(i)-x(i));
end
if (err2<tol)

stop=1;
end
k=k+1;
for i=1:n
xo(i)=x(i);
end
end
for i=1:n
fprintf(x(%d)=%f\n,i,x(i));
end
fprintf(iterations %d \n,k);

1.1

Steepest descent '

~

Z

`
O
s

6
x

#
q

+

A~

&

`


M

:_

&


h
rH


\


ry


H]


X

>


M

:

>



4



H

s


.
t


X
t
O

`





4

t

`

e


.

\

, Steepest Descent ~
Z


O
rq


&
&
h


X
t


l
H


u
\
@
/K
"
f



9
HK

\
q

&

h


4


. 

"
f, s
~
Z


O


`
6
x

#
K
\


ry


H]


X


`

~

Z

`
O
&

6
h
x

e


.


"
fq

+

Ar


%
7
_
K
\

M
+
:
l
u
\
&



H

H]

j\

6
x

a
)
.
Steepest descent ~
Z

\
O
@
/K

^
&

h

,

j

t


H/

M
B
_
~


l

<
_

A
n



\
s

6
x


H~

Z


O

#
l
"
f
H





<

_

G
D

j5
w



&



H

\

s
6
x


+
s


.
$

 2
"
_

<
\



9
K


.
5

q

<
f (x, y)\
@
/K
~

<
_

j

.

A
n



~

s


,
j@
/y

r f (x, y)

+
e


.
5


<
\
"
f_
 Steepest descent
Steepest descent ~
Z

`
O
s

6
x

#
K
\


`
1
M

:,
A
n




H



_

_
&

h
\
"
f
f
s


&

F
G5
w


l
1
0
AK

A
n



\
&
{
h

q

Y
V

()\


L

Y
#
~



&



H~

Z

`
O


6
x



. s
M
:


-




e


, 




s
4
0
y#
p
Qt
>

a
)
. 

"
f&
X
h

]



\


&


, s
\


#


H~


`
4



.
>
h_
K
\
t


H

w

n
~
&

f1 (x, y) = 0, f2 (x, y) = 0
_
K
\




H

H]

j\


ty
q
K



.
j

<
g g(x, y) = 2i=1 [fi (x, y)]2 

5

150

100

50

0
5
0

f (x, y)

x(0)

5 5
a

> 1: Steepest descent_

~
4

M
+

:
j@
/y

r g(x, y)s


,
w

n
~
&

s



q


'

=`
>
s


6
x

#
>




. 
6

q
V
Y

\




,



u&
p
]
h
y
X

s
1
x
l
#
D
h

r

x(1), 7

x(1) = x(0) g(x(0))`


`
1


e


. s
M
:,
~

l
\
1


H

. 
6

&
X
h

]


`

&

{
h
y


&


,
l


0

 1

,
l
\
&

x(0)\

@

/{
9

g


<

 x(1)`
@

/{

9
D


rg


<


s
\
q



#
\


m

#


Hr


'
`


4



.



>
[
j>
h_
K
\
t


Hr


%
\
7

s
~
Z

`
O
&

6
h
x

+
e


. 

6

5

q

<
f : R3 Rs

f1 (x, y, z) = 0, f2 (x, y, z) = 0, f3 (x, y, z) = 0


e

K


.
j

<
g g(x, y, z) = 3i=1 [fi (x, y, z)]2 

M
+
:, K
 x =
(x, y, z)t \


>
1

a
)
. 0
A_
~
Z


O


t


[
j>
h_
K
\
t


H

w

~
n
&

\

d
"
fK
\




H~

Z

`
O
&




,

1)
l
H


u
 x(0) = (x0 , y0 , z0 )t \
"
f
j

<
g\
>





.
2) x(0)\
"
f g_

`

y



>


H~




&




.
3) &
X
h

]y
s
1
x
l

, D
h

r

x(1)`

1
H

.
s

Q


r'
`


4

'



. #
Q
 > 0\
"
@
/K
 x(1) = x(0) g(x(0)) 



. 
s]
j&
]
h

X


`

1
H

H]

j




.
h() = g(x(0) g(x(0))),
6



H


<
\



9

. s
M
:
H h\



j

o

H

s


. h_

j5
w

r h\


p

r

#

j5
w




H~

Z


O

`
1


e





r>


`


9


, 1 < 2 < 3
[

j
\
Y

J

"
f h()_

j5
w








. s
\
0

A
K
 1
 3 \
&



HX

<,
_
#
\
0

AK
 1 = 0

r

. 
6

h(3 ) <
h(1 )
 3 `


1
r

, 2 = 3 /2



. #
l
"
f x(1) = x(0) g(x(0))

H


.
l
\
&

x(0)\

@

/{
9




<

< x(1)\
@

/{
9

D

h

r


<

g_

s
\
q




"

f 2 \


m

s


Hr


'`


4

#
[1 , 3 ]\
"
f h_

j
5
w


`
1


e


.
Steepest descent ~
Z

`
O
s

6
x

#

2

K
\
t


H\

V]
j\


#

Q


.
d
UV


6
_


#
Q


w

n
~
&

`

Steepest descent ~

Z

`
O
s

6
x

#
x, y_

H


K
\


K


.
l

|


r x0 = 0, y0 = 0

&


.
3x y = 4, x + y = 2.

0
A
H]

j_
 MATLAB

H steep2.m


6




.
%%%%%%%%%%%%%%%%%%%%%%%%%%% steep2.m %%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc; clear;
f1=inline(3*x(1)-x(2)-4,x);
f2=inline(x(1)+x(2)-2, x);
x=[0 0]; tol=1.0e-7; N=100; k=1; alpha = 1;
fprintf(---------------------------------------------------\n);
fprintf(count

resid

alpha

y \n);

fprintf(---------------------------------------------------\n);
while (k<=N)
g1=f1(x)^2+f2(x)^2;
J = [3 -1; 1 1];
z=2*J*[f1(x);f2(x)];
z0=sqrt(z(1)^2+z(2)^2);
if(z0==0)
break;

end
z=z/z0;
alpha1=0;
alpha2=1;
g2=f1(x-alpha2*z)^2+f2(x-alpha2*z)^2;
while (g2>=g1)
alpha2=alpha2/2;
g2=f1(x-alpha2*z)^2+f2(x-alpha2*z)^2;
if (alpha2<tol/2)
break;
end
end
g=min(g1, g2);
if(g==g1)
alpha=alpha1;
else
alpha=alpha2;
end
x=x-alpha*z;
gg = max(abs(g1),abs(g2));
resid=abs(g-gg);
fprintf(

%2d

%f

%f

%f

%f \n,k, resid,alpha,

x(1),x(2));
if (resid<tol)
break;
end
k=k+1;
end
fprintf(---------------------------------------------------\n);
s
\
z



'
K




6
_




\
%

`
3


e


, K
\

s
 
H

`

S





+
e


.
--------------------------------------------------count

resid

alpha

--------------------------------------------------8

17.884271

1.000000

0.989949

-0.141421

1.404620

0.500000

1.488770

-0.107091

0.331470

0.250000

1.319048

0.076469

0.115706

0.250000

1.542289

0.189000

0.046569

0.250000

1.335194

0.329043

0.030499

0.250000

1.585183

0.331397

0.008219

0.250000

1.355256

0.429548

0.010794

0.250000

1.603655

0.401299

0.162039

0.125000

1.484880

0.440255

10

0.005454

0.062500

1.505803

0.499149

11

0.000317

0.007813

1.498178

0.500848

12

0.000001

0.003906

1.501951

0.499836

13

0.000039

0.001953

1.500041

0.500243

14

0.000000

0.000244

1.500088

0.500004

--------------------------------------------------
6

3>
h_

5

q

<
\
t


3>
h_
p
t

\
t


H

w


n

<
d
\

"
f
Steepest descent ~
Z

`
O
s

6
x

\

V]
j\


#

Q

.

d
UV


6
_


#
Q


w

~
n
&

`

Steepest descent ~

Z

`
O
s

6
x

#
x, y, z_

H


K
\


K


.
l

|


r x0 = 0.5, y0 = 0.5, z0 = 0.5

&


.
x2 sin(y) + 0.5 cos(z) = 0.5,
3x cos(y) + sin(z) = 0,
x2 + y 2 + z 2 = 0.95.

0
A
H]

j_
 MATLAB

H steep3.m


6




.
%%%%%%%%%%%%%%%%%%%%%%%%%%% steep3.m %%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc; clear;
f1=inline(x(1)^2-sin(x(2))+0.5*cos(x(3))-0.5,x);
f2=inline(3*x(1)-cos(x(2))+sin(x(3)), x);
f3=inline(x(1)^2+x(2)^2+x(3)^2-0.95,x);

x=[0.5 0.5 0.5]; tol=1.0e-10; N=100; k=1;


fprintf(---------------------------------------------\n);
fprintf(count

resid

\n);

fprintf(---------------------------------------------\n);
while (k<=N)
g1=g_func(x);
z=2*j_func(x)*f_func(x);
z0=sqrt(z(1)^2+z(2)^2+z(3)^2);
if(z0==0)
break;
end
z=z/z0;
alpha1=0;
alpha3=1;
g3=g_func(x-alpha3*z);
while (g3>=g1)
alpha3=alpha3/2;
g3=g_func(x-alpha3*z);
if (alpha3<tol/2)
break;
end
end
alpha2=alpha3/2;
g2=g_func(x-alpha2*z);
g=min(g2, g3);
if(g==g2)
alpha=alpha2;
else
alpha=alpha3;
end
x=x-alpha*z;
gg = max(abs(g1),abs(g2));
resid=abs(g-gg);

10

fprintf( %2d

%f

%f

%f

%f \n,k, resid,

x(1),x(2),x(3));
if(resid<tol)
break;
end
k=k+1;
end
fprintf(---------------------------------------------\n);

function F=f_func(x)
f1=inline(x(1)^2-sin(x(2))+0.5*cos(x(3))-0.5,x);
f2=inline(3*x(1)-cos(x(2))+sin(x(3)), x);
f3=inline(x(1)^2+x(2)^2+x(3)^2-0.95,x);
F=[f1(x);f2(x);f3(x)];

function g=g_func(x)
f1=inline(x(1)^2-sin(x(2))+0.5*cos(x(3))-0.5,x);
f2=inline(3*x(1)-cos(x(2))+sin(x(3)), x);
f3=inline(x(1)^2+x(2)^2+x(3)^2-0.95,x);
g=f1(x)^2+f2(x)^2+f3(x)^2;

function J=j_func(x)
J = [2*x(1) -cos(x(2)) -0.5*sin(x(3));
3 sin(x(2)) cos(x(3));
2*x(1) 2*x(2) 2*x(3)];
s
\
z



'
K




6
_




\
%

`
3


e


, K
\

s
 
H

`

S





+
e


.
--------------------------------------------count

resid

--------------------------------------------11

0.830694

0.264953

0.451293

0.430141

0.030622

0.203444

0.442816

0.437284

0.045506

0.202415

0.449717

0.562089

0.032611

0.147967

0.423752

0.578446

0.088482

0.168043

0.333255

0.810626

0.079948

0.064246

0.265928

0.792788

0.048462

0.135602

0.199164

0.870737

0.045364

0.085886

0.161410

0.867693

0.110783

0.073254

-0.062756

0.977648

10

0.009241

0.055402

-0.082549

0.961336

11

0.009425

0.076436

-0.140974

0.954241

12

0.003298

0.062153

-0.146564

0.951258

13

0.002691

0.051084

-0.175626

0.954333

14

0.000556

0.057300

-0.180294

0.955109

15

0.000498

0.052380

-0.194185

0.949914

16

0.000191

0.055618

-0.195888

0.951282

17

0.000109

0.056389

-0.203582

0.952397

18

0.000029

0.054730

-0.203957

0.951436

19

0.000007

0.055273

-0.204752

0.951273

20

0.000004

0.054752

-0.205480

0.950884

21

0.000002

0.055083

-0.205832

0.950956

22

0.000003

0.054779

-0.206733

0.950735

23

0.000001

0.054963

-0.206883

0.950789

24

0.000001

0.054846

-0.207845

0.950666

25

0.000000

0.054904

-0.207860

0.950680

26

0.000000

0.054891

-0.207863

0.950673

27

0.000000

0.054886

-0.207891

0.950661

28

0.000000

0.054891

-0.207895

0.950664

29

0.000000

0.054888

-0.207897

0.950664

30

0.000000

0.054889

-0.207900

0.950665

--------------------------------------------s


<
\
"
f_
 Steepest descent
Discrete steepest descent~
Z


O
r

p
#

r~

&

`


u
K
$
&
3

h

HX

<\

s
6
x

&
HX

<s

/

N
B
(S = [x1 , x2 , , xn ] [y1 , y2 , , yn ] [ ])\

"
f
5

q

<

g_

A
n



g\
s




o
#
d g`


K
"
f>


a
)
.

12

\
V\
[

t#

Q 1

"


o

<
D1 4u(x), x [0, 2] R\
r




o\


8


~
P
\
&

_

>

D10 `


l


rA
:
>

D1 = 3
`




H

H]

j\


ty
q



.
ut (x) = D1 4d u(x)

for

x [0, 2]

o

discrete steepest descent ~
Z

`
O
&

6
h
x

#
D1 _

`





. #
l
"
f

l


D10 = 7.0

r



.
rA
:


 n
P

:
_


s






<

Analytic solution
Initial guess

0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
0

> 2: 1


"
discrete steepest descent ~
Z


O

&



s

s

 0


4

H

`



. #
l
"
fs


g(x, D1n )

\
&

h
A
n




re

_

_
7
x

r d\

@
/
#

d g(x, D1n ) =

g(x, D1n ) g(x, D1n1 )


d

&




D1n = argmin kg(x, D1n )k


| {z }
D1 R

steepest descent ~

\
Z


O





a
)
.

r~

2
"

H]

j


 e


HX

<, 
6

rd

s

e





&


. 
s
\


H u(x)

< v(x)`





+



l
u
\

s

\


#
Q"
f

13

rA
:

_
 D1
< D2 \


K


.
ut = D1 4d u uv
vt = D2 4d v
0
Ad
`

s




o


6
,

un 2uni + uni+1
un+1
uni
i
= D1 i1
uni vin+1
t
h2
n
v n 2vin + vi+1
vin+1 vin
= D2 i1
2
t
h

(3)

l


D10
 D20 \
@
/
7

x

r`

d = (d1 , d2 )

&


.

Q


rA
:


_


s






<

H g(x, D1n , D2n )



&

t
9 s



o
a
)
A
n




H

6


.

d g(x, D1n , D2n )

g(x, D1n , D2n ) g(x, D1n1 , D2n ) g(x, D1n , D2n ) g(x, D1n , D2n1 )
,
d1
d2

s
]
j

r~

steepest descent ~
Z

`
O






a
)
.
1.6

Initial noise for D1


Solution for D2
Solution for D1
Solution for D2

1.4
1.2
1
0.8
0.6
0.4
0.2
0
0.2
0

0.2

0.4

0.6

0.8

> 3: 2

"
steepest descent

(D1n , D2n ) = argmin kg(x, D1n , D2n )k


| {z }
D1 ,D2 R

14

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
double *dvector (long nl, long nh);
void print_vec2(double *a,int v1, int v2, double *b,int w1,
int w2, int num);
void zero_vector(double *a, int nl, int nh);
double calculation(double *ue,double *uo,double *un,double
v1,double v2,
double *ve,double *vo,double *vn,double
w1,double w2,
double D1,double D2,double r,int nt,double *x);
int main()
{
double *un,*uo,*vo,*vn,*x,*ue,*ve,D1,D2,dt,dx,r,pi,xa,xb,dx2;
int n,nt,i,t;
D1=3;D2=7;n=50;nt=1000;
pi = 4.0*atan(1.0);
uo=dvector(1,n);un=dvector(1,n);
vo=dvector(1,n);vn=dvector(1,n);
ue=dvector(1,n);ve=dvector(1,n);
x =dvector(1,n);
xa=0;xb=1;
dx=(xb-xa)/(n-1);
for (i=1;i<=n;i++){
x[i]=xa+(i-1)*(xb-xa)/(n-1);
}
dt=0.00001;
dx2=dx*dx;
r=dt/dx2;
for (i=1;i<=n;i++){
uo[i]=0.7*sin(pi*x[i]);

15

}
for (i=1;i<=n;i++){
vo[i]=sin(pi*x[i]);
}
for (t=1;t<=nt;t++){
for (i=2;i<=n-1;i++){
vn[i]=vo[i]+D2*r*(vo[i-1]-2*vo[i]+vo[i+1]);
}
vn[1]=vo[1];
vn[n]=vo[n];
for (i=2;i<=n-1;i++){
un[i]=uo[i]+D1*r*(uo[i-1]-2*uo[i]+uo[i+1])+0.001*uo[i]*vn[i];
}
for (i=1;i<=n;i++){
uo[i]=un[i];
vo[i]=vn[i];
}
}/* t end */
for (i=1;i<=n;i++){
ue[i]=un[i]+0.2*(0.5-rand()/((double)RAND_MAX));
ve[i]=vn[i]+0.2*(0.5-rand()/((double)RAND_MAX));
}
ue[1]=ue[n]=ve[1]=ve[n]=0;
print_vec2(ue,1,n,ve,1,n,3);
print_vec2(un,1,n,vn,1,n,2);
int kkk,stop=0,stop1=0;
double dd1,dd2,dds1,dds2,er,*z,var1,var2,z0,tol =
1.0e-7,al0,al1,al2,al3,g,g0,g1,g2,g3,h1,h2,h3,alpha;
dd1=0.1;dd2=0.1;
kkk=1;
z=dvector(1,2);

16

er=calculation(ue,uo,un, 1, n, ve,vo,vn,1,n,
dd1,dd2,r,nt,x);
printf("er %f \n",er);
while ( (kkk<5000) && (stop==0) ){ /*step2*/
/* step 3 */
dds1=dd1;dds2=dd2;
g1=calculation(ue,uo,un, 1, n, ve,vo,vn,1,n,
dd1,dd2,r,nt,x);
printf("g1 %f kkk %d \n",g1,kkk);
var1=calculation(ue,uo,un, 1, n, ve,vo,vn,1,n,
dd1+0.0001,dd2,r,nt,x);
var2=calculation(ue,uo,un, 1, n, ve,vo,vn,1,n,
dd1,dd2+0.0001,r,nt,x);
z[1]=(var1-g1)/0.1;
z[2]=(var2-g1)/0.1;
printf("z[1] %f ,z[2] %f\n",z[1],z[2]);
printf("var1 %f ,var2 %f\n",var1,var2);
z0=sqrt(z[1]*z[1]+z[2]*z[2]);
printf("z0 %f\n",z0);
if (fabs(z0)<tol)/*step 4 */
{
printf("z0 is less then tol, z0 %f\n",z0);
stop=1;
printf(" \n");
break;
}/*step 4 end */
/*step 5*/
z[1]=z[1]/z0;
z[2]=z[2]/z0;
printf("z1 %f, z2 %f \n",z[1],z[2]);
al1=0;
al3=1;

17

dd1=dds1-al3*z[1];
dd2=dds2-al3*z[2];
g3=calculation(ue,uo,un, 1, n, ve,vo,vn,1,n,
dd1,dd2,r,nt,x);
printf("g3 %f\n",g3);
/*step 5 end */
/*step 6 end */
while ((g3 >= g1)&&(stop1==0)){
al3=al3/2;
dd1=dds1-al3*z[1];
dd2=dds2-al3*z[2];
g3=calculation(ue,uo,un, 1, n, ve,vo,vn,1,n,
dd1,dd2,r,nt,x);
/*step 7 end */
if (al3<tol/2){
stop1=1;
printf("stop al3 %f\n",al3);
}
/*step 8 end */
}
stop1=0;
/*step 6 end */
al2=al3/2;
dd1=dds1-al2*z[1];
dd2=dds2-al2*z[2];
g2=calculation(ue,uo,un, 1, n, ve,vo,vn,1,n,
dd1,dd2,r,nt,x);
h1=(g2-g1)/al2;
h2=(g3-g2)/(al3-al2);
h3=(h2-h1)/al3;
/*step 10 end */
al0=0.5*(al2-h1/h3);

18

dd1=dds1-al0*z[1];
dd2=dds2-al0*z[2];
g0=calculation(ue,uo,un, 1, n, ve,vo,vn,1,n,
dd1,dd2,r,nt,x);
/*step 11 end */
alpha= (g0<g3) ? al0:al3;
g= (g0<g3) ? g0:g3;
/*step 12 end */
dd1=dds1-alpha*z[1];
dd2=dds2-alpha*z[2];
/*step 13 end */
if (fabs(g3-g1)<tol){
stop=1;
} /*step 14 end */
kkk=kkk+1;/* step 15 */
printf("kkk %d and g %f D1 %f and D2 %f\n
",kkk,g,dd1,dd2);
}/*step3 step15*/
print_vec2(un,1,n,vn,1,n,4);
return 0;
}
double *dvector (long nl, long nh)
{ double *v;
v=(double *) malloc((nh-nl+1+1)*sizeof(double));
return v-nl+1;
}
void print_vec2(double *a,int v1, int v2, double *b,int w1,
int w2, int num)
{
char filename[256];
char buffer[10];
FILE *fp;
int i;

19

strcpy(filename, "print");
sprintf(buffer, "%d", num);
strcat(filename, buffer);
strcat(filename, ".m");
fp=fopen(filename, "w");
fprintf(fp,"aa%d=[ ",num);
for (i=v1; i<=v2; i++) {
fprintf(fp,"%f \n",a[i]);
}
fprintf(fp,"];\n\n\n",num,num);
fprintf(fp,"bb%d=[ ",num);
for (i=w1; i<=w2; i++) {
fprintf(fp,"%f \n",b[i]);
}
fprintf(fp,"];x=linspace(0,1,40);figure(%d),plot(x,aa%d,x,bb%d);",
num,num,num);
fclose(fp);
}
void zero_vector(double *a, int nl, int nh)
{
int i;
for (i=nl; i<=nh; i++)
a[i] = 0.0;
return;
}
double calculation(double *ue,double *uo,double *un,double
v1,double v2,
double *ve,double *vo,double *vn,double
w1,double w2,
double D1,double D2,double r,int nt,double *x)
{
int t,i,n;
double pi,e=0.0,es=0.0;

20

n=v2-v1+1;
pi = 4.0*atan(1.0);
for (i=1;i<=n;i++){
uo[i]=0.7*sin(pi*x[i]);
}
for (i=1;i<=n;i++){
vo[i]=sin(pi*x[i]);
}
for (t=1;t<=nt;t++){
for (i=2;i<=n-1;i++){
vn[i]=vo[i]+D2*r*(vo[i-1]-2*vo[i]+vo[i+1]);
}
vn[1]=vo[1];
vn[n]=vo[n];
for (i=2;i<=n-1;i++){
un[i]=uo[i]+D1*r*(uo[i-1]-2*uo[i]+uo[i+1])+0.001*uo[i]*vn[i];
}
for (i=1;i<=n;i++){
uo[i]=un[i];
vo[i]=vn[i];
}
}/* t end */
for (i=1;i<=n;i++){
e=fabs(un[i]-ue[i]);
es=es+e;
}
for (i=1;i<=n;i++){
e=fabs(vn[i]-ve[i]);
es=es+e;
}
return es;
}

21

V
2

Conjugate Gradient(CG) '

CG ~
Z


O
r nn

&

(positive definite)
+

A>

\
f

]


X
l

0
AK


&%

3
.
CG ~
Z

`
O
s

6
xK

K
\



l
0
AK
"
f
H Gauss elimination with pivoting%

!

3
n
>

\


5
g

t

s





r >


`



9



l
 M
:
H\

{

9
&


h

&
s
h





.

Q
 CG ~
Z


O
r

>

H]

j\
"
f7
x7

x^


e


H large

sparse systems with nonzero entries occurring in predictable patterns\


l

0
A

K

B

6
x


. &
X
h

]


|
s


#
Q



, CG ~

Z

`
O
s

6
xK

 n
>

\
&
X
h

]
H




`

%

`
3


e


.
s
]
\
X
"
f'

= A
>
H

&

(0s



7
'
 x\
@
/K
"
f hx, Axi > 0, A
H@

/g
A)


&



.
o

x
< y n

"
7

'{
M
9
:, ?
/&
`
h


6


s

&



.
hx, yi = xt y

(4)


Q
 xt Ay = xt At y = (Ax)t ys



hx, Ayi = hAx, yi

(5)

$

n



. 
A




H CG ~

Z

`
O


l
0
A
l


r&
:

h
&


s

.
x 
&


+

A>

 Ax = b_
K


H


h
a

g(x) = hx, Axi 2hx, bi


 x
\"
f
j5
w

H


H

z


1
x
l
us

.
Proofx
< v 6= 0 

t


H7

'
s

t
Hz








&



.
X

O



g(x + tv)

= hx + tv, Ax + tAvi 2hx + tv, bi


= hx, Axi + thv, Axi + thx, Avi + t2 hv, Avi 2hx, bi 2thv, bi
= hx, Axi 2hx, bi + 2thv, Axi 2thv, bi + t2 hv, Avi


`
7

g(x + tv) = g(x) + 2thv, Ax bi + t2 hv, Avi

(6)


a
)
. x
< v 

s
l
M
:
H\

, t\
@
/
s




<
h\


6


s

&

e


.
h(t) = g(x + tv)
22

s


_

>

hv, Avi

s
l
M
:
H\

h0 (t) = 0
&

\
h
"
f h
j5
w






.

Q

h0 (t) = 2hv, Ax bi + 2thv, Avi


H


hv, b Axi
hv, Ax bi
=
t =
hv, Avi
hv, Avi
9
{
M
:
j5
w

, d
(6)\

_
K
"
f
h(t) =

hv, b Axi
g(x) 2
hv, b Axi +
hv, Avi

hv, b Axi
hv, Avi

2
hv, Avi

g(x)

hv, b Axi
hv, Avi

s
$

n



.

Q

hv, b Axi 6= 0 {
9
M
: 0s



7
'
 v\
/
@K
"
f g(x +

tv) < g(x) $

n



. x  Ax = b`


7




&


.

Q
#

Q*

7


'
 v\
@
/K
"
f
hv, b Ax i = 0 $


n

, s

H g(x) g(x )





|
9

\
6
O


`_
p



.

Q

x {
9
M
: g
H

j5
w

H

.
@

/
x  g\



>

H 7

'


&


.

Q
 #

Q*

7

'


v\
@
/K
"
f
g(x + tv) g(x ) $

n



.

Q

hv, b Ax i
H 0s


&

, s

H b Ax `

>

w
p


.
Ax = b_

H

K
 x
< x\
"
f


8

r

H

K

_
~

_

p


H


o~

(search direction) 7

'
v 6= 0\


ty
q


. r = b Ax\
x\

@
/


7
'
(residual vector associated with x)
&



, t\


6


s

&



.
t=

hv, ri
hv, b Axi
=
hv, Avi
hv, Avi

r 6= 0s


v = r

, g(x + tr)

H g(x)




t


s

H x



x \




H

`

_

p



. s
\
s

6
xK

"
f
o

H CG ~

Z

`
O

+
e



.
x0  x _

l

H


s


, v(1) 6= 0
l


o~



&


. k =
1, 2, 3, ...,\
@
/K
"
f
tk =

hv(k) , b Ax(k1) i
hv(k) , Av(k) i

23

(7)

x(k) = x(k1) + tk v(k)

(8)

>

\



, D
h

r


o~

v(k+1) `

1
H

. s
~
Z

`
O
s

6
xK

"
f x

H


&

H

\
 {xk }`
P


`
1


e


.

o~


l
1
0
AK
"
f g\
x = (x1 , x2 , ..., xn )t \


@
/

<



ty
q


.

Q


g(x1 , x2 , ..., xn ) = hx, Axi 2hx, bi =

n X
n
X

aij xi xj 2

i=1 j=1

n
X

xi bi

i=1

$

n



. g\
xk \

@
/K
"
fp

r




n
X
g
(x) = 2
aki xi 2bk
xk
i=1

%

\
`
3


e


.

Q

rs
 x\
@
/

7
'
{
9
M
: g_

A
n



(gradient)
H


6


s

>


a
)
.

t
g
g
g
g(x) =
(x),
(x), ...,
(x) = 2(Ax b) = 2r
x1
x2
xn

o

H




p
&

h
r


<

'
 g(x) 



>
y



H~


 g(x)e




`

e


. 7
s


H


7
'
 r_
 ~

_

p



.
"

f 

r 


<
s


v(k+1) `


6


s






H~

Z

`
O
Steepest descent~

Z

s
O





.
v(k+1) = r(k) = b Ax(k)
s
 ~
Z


O
r q


+

A>

\


M

:
&

`
h
t

t


5
4
q


K

 
6
x

&t

H

. 
s\
@
/
@

/


o

H 

6
`



7


H 0s

 

 7

'

{v(1) , . . . , v(n) }\


6
x



.
hv(i) , Av(j) i = 0,

if

i 6= j

s

|
`

A-f



|
(A-orthogonality condition)s





, {v(1) , . . . , v(n) }`


A-f


(A-orthogonal)




. s
7
'
[
t

r{


9
1
qw
l
s
n

. s
|
9




K
d
(7)

<d
(8)\

%

`
3


e


.

6
&


Hs





o~

s

6
x

M

:



n
>

\


u

&


h


4
`

%

`
3


e



H

z

`


#

r

. 7

t&


h

&


X


s

~
Z


O
:

`
xK

&

X
K

\
%

`
3


e


.

24

{v(1) , . . . , v(n) }s

&


&


a
)
'

= A\
>
@
/K
"
f 0s



h
a

A-f


|

9
s
+

, v(0)
re

_

_


&


.
o

k = 1, 2, . . . , n\

@
/K
"
f
tk =

hv(k) , b Ax(k1) i
hv(k) , Av(k) i

o


x(k) = x(k1) + tk v(k)

&



,

t&


h

&


X


&




, 

6
s

$

n



.
Ax(n) = b

Proof

H k = 1, 2, ..., n\

@
/K
"
f x(k) = x(k1) + tk v(k) s
l
M
:
H\

,
Ax(n)

= Ax(n1) + tn Av(n)
= (Ax(n2) + tn1 Av(n1) ) + tn Av(n)
..
.
= Ax(0) + t1 Av(1) + t2 Av(2) + ... + tn Av(n)

%

\
`
3


e


\

b\

+

6
d

`

%

`
3


e


.
Ax(n) b = Ax(0) b + t1 Av(1) + t2 Av(2) + ... + tn Av(n)

\

v(k) \
@
/
?

/&
`
h
>




, ?

/&
_
h
$


9
 A @
/g
As


H

z

'

6

rd

`

%

`
3


e


.
hAx(n) b, v(k) i =

hAx(0) b, v(k) i + t1 hAv(1) , v(k) i + ... + tn hAv(n) , v(k) i

hAx(0) b, v(k) i + t1 hv(1) , Av(k) i + ... + tn hv(n) , Av(k) i

y
k\

@
/K
"
f A-f


_
$

`
9
&

6
h
xr

v

,

hAx(n) b, v(k) i = hAx(0) b, v(k) i + tk hv(k) , Av(k) i

(9)

s

a
)
.

,

tk =

hv(k) , b Ax(k1) i
hv(k) , Av(k) i

s
l
M
:
H\

,
tk hv(k) , Av(k) i = hv(k) , b Ax(k1) i
= hv(k) , b Ax(0) + Ax(0) Ax(1) + ... Ax(k2) + Ax(k2) Ax(k1) i
= hv(k) , b Ax(0) i + hv(k) , Ax(0) Ax(1) i + ... + hv(k) , Ax(k2) Ax(k1) i
25


j
t

e


.

H i\

@
/
#

x(i) = x(i1) + ti v(i)

and

Ax(i) = Ax(i1) + ti Av(i)

s


, Ax(i1) + Ax(i) = ti Av(i) 


&
,
tk hv(k) , Av(k) i = hv(k) , b Ax(0) i t1 hv(k) , Av(1) i ... tk1 hv(k) , Av(k1) i
3

`

%
H

. A-f


_
$

9
M
:
H\

, i 6= k

 i\
@
/K
"
f hv(k) , Av(i) i = 0`


7



,

Q

hv(k) , Av(k) itk = hv(k) , b Ax(0) i



a
)
. (9)

'
,
hAx(n) b, v(k) i =

hAx(0) b, v(k) i + hv(k) , b Ax(0) i


hAx(0) b, v(k) i + hb Ax(0) , v

(k)

hAx(0) b, v(k) i hAx(0) b, v

(k)

i
i


a
)
. 7
'
 Ax(n) b
H A-f



7
'
|
9

{v(1) , ..., v(n) }\
+
@
/K
"
ff


s

l
M
:
H\

, Ax(n) b = 0

H



r`
:
%

`
3


e


.
CG ~
Z

_
O


o
7

r

6




.
CG cycle

Define the maximum number of iteration IT ER and the error tolerance T OL


Set r0 = b Ax0 , v0 = r0
Set k = 0
While (k IT ER
tk =

&

krk k2 > T OL)

kT k

T
vk Avk

xk+1 = xk + tk vk
vk+1 = vk tk Avk
k =k+1
End While

6

r CG ~

`
O
s

6
x


H\

V]
j
<
\
@
/
MATLAB


s

.
26

dV
U

Q


+

A>

 Ax = b_
K
\
l norm\

"
f_


 104




t
>

H



#

.

ai,j

4,

=
1,

0,

when j = i and i = 1, 2, ..., 16,

j = i + 1 and i = 1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15,

j = i 1 and i = 2, 3, 4, 6, 7, 8, 10, 11, 12, 14, 15, 16,


when

j = i + 4 and i = 1, 2, ..., 12,

j = i 4 and i = 5, 6, ..., 16,


otherwise

and
b

= (1.90, 1.05, 1.17, 3.48, 0.81, 0.26, 0.41, 1.17, 0.91, 0.15,
0.26, 1.05, 1.96, 0.91, 0.81, 1.90)

preconditional matrix
H A_

 @
/y

'

= D\
>
@
/K
"
f 
6


s

 &

'
=`
>


6
x



.
M 1 = D1/2

%%%%%%%%%%%%%%%%%%%%%%%%%%%% CGcode.m %%%%%%%%%%%%%%%%%%%%%%%%%%%


clear; clc;
for i=1:16
for j=1:16
if (j==i)
A(i,j) = 4;
else if ((j==i+1) && (mod(i,4)~=0)) || ...
((j==i-1) && (mod(i,4)~=1)) || ...
((j==i+4) && (i<=12)) || ((j==i-4) &&
(i>=5))
A(i,j) = -1;
else
A(i,j) = 0;

27

end
end
end
end
b = [1.90; 1.05; 1.17; 3.48; 0.81; -0.26; -0.41; 1.17;
0.91; -0.15; -0.26; 1.05; 1.96; 0.91; 0.81; 1.90];
x = zeros(16,1);
r = b-A*x;
v = r;
tol = 1.0; i = 1;
while (tol > 10^(-4))
alpha = (r*r)/(v*(A*v));
x = x + alpha*v;
rnew = r - alpha*A*v;
beta = (rnew*rnew)/(r*r);
v = rnew + beta*v;
r = rnew;
tol = max(abs(b-A*x));
res(i) = tol;
i = i+1;
end
CGcode.m`
z



'
r
v



6

r



\
%

`
3


e


.
>> CGcode
res
0.9607

1.0393

0.4626

0.0024

0.0006

0.0000

0.1188

28

0.0551

0.0346

Você também pode gostar