mathkit  1.5
 All Classes Namespaces Functions Variables Typedefs
template_impl.cpp
1 template<typename Func>
2 Vector each(Func func, const Vector & data) {
3  Vector vec;
4  Vector::const_iterator citer;
5  for (citer = data.begin(); citer != data.end(); ++citer) vec.push_back(func(*citer));
6  return vec;
7 }
8 
9 template<typename Func>
10 Vector filter(Func func, const Vector & data) {
11  Vector result;
12  Vector::const_iterator citer;
13  for (citer = data.begin(); citer != data.end(); ++citer)
14  if (func(*citer)) result.push_back(*citer);
15  return result;
16 }
17 
18 template<typename Func>
19 bool probe(Func func, Pair & guess, double factor, int ntry) {
20  double lv = func(guess.first);
21  double rv = func(guess.second);
22  while (ntry > 0) {
23  if (lv * rv <= 0) return true;
24  if (abs(lv) < abs(rv)) {
25  guess.first -= factor * (guess.second - guess.first);
26  lv = func(guess.first);
27  }
28  else {
29  guess.second += factor * (guess.second - guess.first);
30  rv = func(guess.second);
31  }
32  --ntry;
33  }
34  return false;
35 }
36 
37 template<typename Func>
38 Pairs scan(Func func, Pair scope, int nr) {
39  Pairs vec;
40  Vector marks = linspace(scope.first, scope.second, nr + 1);
41  for (int i = 0; i < nr; ++i) {
42  if (func(marks[i]) * func(marks[i+1]) <= 0) vec.push_back(make_pair(marks[i], marks[i+1]));
43  }
44  return vec;
45 }
46 
47 template<typename Func>
48 double solve(Func func, Pair region, const Epsilon & eps) {
49  double lv = region.first;
50  double rv = region.second;
51  if (func(lv) == 0) return lv;
52  if (func(rv) == 0) return rv;
53  while (true) {
54  double mid = (lv + rv) / 2;
55  if (eps(rv - lv) || func(mid) == 0) return mid;
56  if (func(lv) * func(mid) < 0) rv = mid;
57  else lv = mid;
58  }
59 }
60 
61 template<typename Func>
62 double integrate(Func func, Pair region, const Epsilon & eps) {
63  int n = static_cast<int>((region.second - region.first) * 2);
64  if (n < 2) n = 2;
65  Vector marks = linspace(region.first, region.second, n + 1);
66  double s1 = func(marks[0]) + func(marks[n]);
67  double s2 = 0;
68  for (int i = 1; i < n; ++i) s2 += func(marks[i]);
69  s2 *= 2;
70  double s4 = 0;
71  for (int i = 0; i < n; ++i) s4 += func((marks[i] + marks[i+1]) / 2);
72  s4 *= 4;
73  double s = (region.second - region.first) / n / 6 * (s1 + s2 + s4);
74  int k = 2;
75  while (true) {
76  n *= k;
77  marks = linspace(region.first, region.second, n + 1);
78  s1 = func(marks[0]) + func(marks[n]);
79  s2 = 0;
80  for (int i = 1; i < n; ++i) s2 += func(marks[i]);
81  s2 *= 2;
82  s4 = 0;
83  for (int i = 0; i < n; ++i) s4 += func((marks[i] + marks[i+1]) / 2);
84  s4 *= 4;
85  double sn = (region.second - region.first) / n / 6 * (s1 + s2 + s4);
86  if (eps(sn - s)) {
87  s = sn;
88  break;
89  }
90  s = sn;
91  k += 1;
92  }
93  return s;
94 }
95 
96 template<typename T>
97 Vector a2vec(T data[], int len) {
98  Vector vec;
99  for (int i = 0; i < len; ++i) vec.push_back(data[i]);
100  return vec;
101 }