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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
/*
This file contains just an example on how to set-up the matrices for using with
the quadprog() function.
The test problem is the following:
Given:
G = 4 -2 g0^T = [6 0]
-2 4
Solve:
min f(x) = 1/2 x G x + g0 x
s.t.
x_1 + x_2 = 3
x_1 >= 0
x_2 >= 0
x_1 + x_2 >= 2
The solution is x^T = [1 2] and f(x) = 12
*/
#include "stdio.h"
#include "numlib.h"
#include "quadprog.h"
int main() {
double **GG, **G, **CE, **CI;
double *g0, *ce0, *ci0, *x;
int n, m, p;
int i, j;
double f, sum = 0.0;
n = 2;
/* Orginal, unchanged G */
GG = dmatrix(0, n-1, 0, n-1);
GG[0][0] = 4.0;
GG[0][1] = -2.0;
GG[1][0] = -2.0;
GG[1][1] = 4.0;
/* Working copy - gets modified */
G = dmatrix(0, n-1, 0, n-1);
copy_dmatrix(G, GG, 0, n-1, 0, n-1);
g0 = dvector(0, n-1);
g0[0] = 6.0;
g0[1] = 0.0;
p = 1;
CE = dmatrix(0, n-1, 0, p-1);
CE[0][0] = 1.0;
CE[1][0] = 1.0;
ce0 = dvector(0, p-1);
ce0[0] = -3.0;
m = 3;
CI = dmatrix(0, n-1, 0, m-1);
CI[0][0] = 1.0;
CI[0][1] = 0.0;
CI[0][2] = 1.0;
CI[1][0] = 0.0;
CI[1][1] = 1.0;
CI[1][2] = 1.0;
ci0 = dvector(0, m-1);
ci0[0] = 0.0;
ci0[1] = 0.0;
ci0[2] = -2.0;
x = dvector(0, n-1);
f = quadprog(x, G, g0, CE, ce0, CI, ci0, n, p, m);
if (f == QP_INFEASIBLE)
printf("Failed to find solution\n");
else {
printf("Function value at %f %f = %f\n",x[0],x[1],f);
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
sum += x[i] * GG[i][j] * x[j];
sum *= 0.5;
for (i = 0; i < n; i++)
sum += g0[i] * x[i];
printf("Double check funtion value %f\n",sum);
}
free_dmatrix(GG, 0, n-1, 0, n-1);
free_dmatrix(G, 0, n-1, 0, n-1);
free_dvector(g0, 0, n-1);
free_dmatrix(CE, 0, n-1, 0, p-1);
free_dvector(ce0, 0, p-1);
free_dmatrix(CI, 0, n-1, 0, m-1);
free_dvector(ci0, 0, m-1);
free_dvector(x, 0, n-1);
return 0;
}
|