source: CIVL/examples/cg/cg2.cvl

main
Last change on this file was ea777aa, checked in by Alex Wilton <awilton@…>, 3 years ago

Moved examples, include, build_default.properties, common.xml, and README out from dev.civl.com into the root of the repo.

git-svn-id: svn://vsl.cis.udel.edu/civl/trunk@5704 fb995dde-84ed-4084-dfe6-e5aef3e2452c

  • Property mode set to 100644
File size: 2.1 KB
RevLine 
[2d6a470]1/*
2 * Simple implementation of Conjugate Gradient algorithm for 2x2
3 * symmetric matrix. Instead of assuming positive-definite-ness,
4 * we assume that in every division, the denominator is non-0.
5 * Based on https://en.wikipedia.org/wiki/Conjugate_gradient_method
6 */
7
8#include <civlc.cvh>
9#include <stdio.h>
10#define n 2
11
12$input double a1,a2,a3;
13$input double b[n];
14double x[n];
15double xcg[n];
16
17void cg(double A[n][n], double b[n], double x[n]) {
[897c8d7]18 double r[n]; //residual
19 double p[n]; //search direction
[2d6a470]20 double temp[n];
[897c8d7]21 double temp2[n];
22 double rsold; //<r, r>
[2d6a470]23 double rsnew;
24 double alpha;
[897c8d7]25 double beta;
26
27 for (int i=0; i<n; i++) x[i] = 0;
28 for (int i=0; i<n; i++) {
[2d6a470]29 temp[i] = 0.0;
30 for(int j=0; j<n; j++) temp[i] += A[i][j]*x[j];
31 }
[897c8d7]32 for (int i=0; i<n; i++) r[i] = b[i] - temp[i];
[2d6a470]33 rsold = 0.0;
[897c8d7]34 for (int i=0; i<n; i++) rsold += r[i]*r[i];
35 for (int i=0; i<n; i++) p[i] = r[i];
36 for (int k=0; k<n; k++) {
37 for (int i=0; i<n; i++) {
[2d6a470]38 temp[i] = 0.0;
[897c8d7]39 for (int j=0; j<n; j++) temp[i] += A[i][j]*p[j];
[2d6a470]40 }
41 alpha = 0.0;
[897c8d7]42 for (int i=0; i<n; i++) alpha += p[i]*temp[i];
43 $assume(alpha != 0);
[2d6a470]44 alpha = rsold/alpha;
[897c8d7]45 // temp2 = r-alpha*temp
46 for (int i=0; i<n; i++) temp2[i] = r[i] -alpha*temp[i];
47 // r = temp2
48 for (int i=0; i<n; i++) r[i] = temp2[i];
49 // temp2 = x+alpha*p
50 for (int i=0; i<n; i++) temp2[i] = x[i] +alpha*p[i];
51 // x = temp2
52 for (int i=0; i<n; i++) x[i] = temp2[i];
53 if (k<n-1) { // STRUCTURE THIS BETTER!!!
[2d6a470]54 // rsnew = <r,r>
55 rsnew = 0.0;
[897c8d7]56 for (int i=0; i<n; i++) rsnew += r[i]*r[i];
[2d6a470]57 $assume(rsold !=0);
[897c8d7]58 beta = rsnew/rsold;
59 for (int i=0; i<n; i++) temp2[i] = r[i] +beta*p[i];
60 // p = temp2
61 for (int i=0; i<n; i++) p[i] = temp2[i];
[2d6a470]62 rsold = rsnew;
63 }
64 }
65}
66
67void main() {
[897c8d7]68 double Ax[n];
[2d6a470]69 double A[n][n];
70
71 A[0][0] = a1;
72 A[0][1] = a2;
73 A[1][0] = a2;
74 A[1][1] = a3;
75 $assume(b[0]!=0 || b[1]!=0);
76 cg(A,b,xcg);
[897c8d7]77 for (int i=0; i<n; i++)
[2d6a470]78 printf("x[%d] = %f\n\n",i, xcg[i]);
[897c8d7]79 for (int i=0; i<n; i++) {
80 Ax[i] = 0;
81 for (int j=0; j<n; j++)
82 Ax[i] += A[i][j]*xcg[j];
83 $assert(Ax[i] == b[i]);
[2d6a470]84 }
85}
Note: See TracBrowser for help on using the repository browser.