DiffEq - Modern C++ ODE Integration Library 1.0.0
High-performance C++ library for solving ODEs with async signal processing
Loading...
Searching...
No Matches
std_async_integration_demo.cpp
1#define NOMINMAX
2#include <diffeq.hpp>
3#include <future>
4#include <thread>
5#include <chrono>
6#include <iostream>
7#include <vector>
8#include <memory>
9#include <mutex>
10#include <atomic>
11#include <functional>
12#include <numeric>
13
14#ifdef _WIN32
15#include <windows.h>
16#endif
17
30// 示例:参数化系统
32 double alpha, beta;
33
34 SimpleSystem(double a, double b) : alpha(a), beta(b) {}
35
36 void operator()(std::vector<double>& dx, const std::vector<double>& x, double t) const {
37 dx[0] = alpha * x[0] - beta * x[0] * x[1];
38 dx[1] = -beta * x[1] + alpha * x[0] * x[1];
39 }
40};
41
42// 示例:数据分析器
43class DataAnalyzer {
44private:
45 std::vector<std::pair<std::vector<double>, double>> data_;
46 mutable std::mutex data_mutex_;
47
48public:
49 void analyze_result(const std::vector<double>& final_state, double final_time) {
50 std::lock_guard<std::mutex> lock(data_mutex_);
51
52 // 计算简单的统计指标
53 double magnitude = std::sqrt(final_state[0] * final_state[0] + final_state[1] * final_state[1]);
54 double stability = std::abs(final_state[0] - final_state[1]);
55
56 std::cout << "分析结果: 幅度=" << magnitude
57 << ", 稳定性=" << stability
58 << ", 时间=" << final_time << std::endl;
59
60 data_.emplace_back(final_state, final_time);
61 }
62
63 const std::vector<std::pair<std::vector<double>, double>>& get_data() const {
64 std::lock_guard<std::mutex> lock(data_mutex_);
65 return data_;
66 }
67};
68
69// 示例:轨迹保存器
70class TrajectorySaver {
71private:
72 std::string prefix_;
73 std::atomic<size_t> counter_{0};
74
75public:
76 explicit TrajectorySaver(std::string prefix = "traj_") : prefix_(std::move(prefix)) {}
77
78 void save_trajectory(const std::vector<double>& final_state, double final_time) {
79 auto count = ++counter_;
80 std::string filename = prefix_ + std::to_string(count) + ".dat";
81
82 // 模拟文件保存
83 std::cout << "保存轨迹: " << filename
84 << " (状态: [" << final_state[0] << ", " << final_state[1]
85 << "], 时间: " << final_time << ")" << std::endl;
86 }
87};
88
89// 示例:参数优化器
91private:
92 std::vector<double> best_params_;
93 double best_objective_{std::numeric_limits<double>::max()};
94 mutable std::mutex optimizer_mutex_;
95
96public:
97 void update_parameters(const std::vector<double>& params, double objective_value) {
98 std::lock_guard<std::mutex> lock(optimizer_mutex_);
99
100 if (objective_value < best_objective_) {
101 best_objective_ = objective_value;
102 best_params_ = params;
103
104 std::cout << "发现更好的参数: [";
105 for (size_t i = 0; i < params.size(); ++i) {
106 std::cout << params[i];
107 if (i < params.size() - 1) std::cout << ", ";
108 }
109 std::cout << "], 目标值: " << objective_value << std::endl;
110 }
111 }
112
113 std::vector<double> get_best_parameters() const {
114 std::lock_guard<std::mutex> lock(optimizer_mutex_);
115 return best_params_;
116 }
117
118 double get_best_objective() const {
119 std::lock_guard<std::mutex> lock(optimizer_mutex_);
120 return best_objective_;
121 }
122};
123
124int main() {
125#ifdef _WIN32
126 // 设置控制台编码为 UTF-8
127 SetConsoleOutputCP(CP_UTF8);
128#endif
129
130 std::cout << "=== 标准库异步积分示例 ===" << std::endl;
131 std::cout << "展示如何直接使用标准库设施进行异步计算" << std::endl;
132
133 // 创建后处理组件
134 DataAnalyzer analyzer;
135 TrajectorySaver saver("std_traj_");
136 ParameterOptimizer optimizer;
137
138 // 定义参数组合
139 std::vector<std::pair<double, double>> parameters = {
140 {0.5, 0.3}, {0.8, 0.2}, {0.3, 0.7}, {0.6, 0.4},
141 {0.4, 0.6}, {0.7, 0.3}, {0.2, 0.8}, {0.9, 0.1}
142 };
143
144 std::cout << "\n启动 " << parameters.size() << " 个异步积分任务..." << std::endl;
145
146 // 用于存储所有异步任务的 futures
147 std::vector<std::future<void>> integration_futures;
148
149 auto start_time = std::chrono::high_resolution_clock::now();
150
151 // 启动异步积分任务 - 直接使用 std::async
152 for (size_t i = 0; i < parameters.size(); ++i) {
153 const auto& [alpha, beta] = parameters[i];
154
155 // 直接使用 std::async 启动异步任务
156 auto future = std::async(std::launch::async,
157 [&analyzer, &saver, &optimizer, alpha, beta, i]() {
158
159 // 创建积分器和系统
160 SimpleSystem system(alpha, beta);
162 [system](double t, const std::vector<double>& x, std::vector<double>& dx) {
163 system(dx, x, t);
164 }
165 );
166
167 // 执行积分
168 std::vector<double> state = {1.0, 0.5};
169 integrator.integrate(state, 0.01, 10.0);
170
171 std::cout << "任务 " << i << " 积分完成 (α=" << alpha << ", β=" << beta << ")" << std::endl;
172
173 // 后处理任务 - 也使用异步执行
174 std::vector<std::future<void>> post_futures;
175
176 // 分析任务
177 post_futures.push_back(std::async(std::launch::async,
178 [&analyzer, state, time = integrator.current_time()]() {
179 analyzer.analyze_result(state, time);
180 }
181 ));
182
183 // 保存任务
184 post_futures.push_back(std::async(std::launch::async,
185 [&saver, state, time = integrator.current_time()]() {
186 saver.save_trajectory(state, time);
187 }
188 ));
189
190 // 优化任务
191 double objective = std::abs(state[0] - state[1]);
192 std::vector<double> params = {alpha, beta};
193
194 post_futures.push_back(std::async(std::launch::async,
195 [&optimizer, params, objective]() {
196 optimizer.update_parameters(params, objective);
197 }
198 ));
199
200 // 等待所有后处理任务完成
201 for (auto& f : post_futures) {
202 f.wait();
203 }
204
205 std::cout << "任务 " << i << " 后处理完成" << std::endl;
206 }
207 );
208
209 integration_futures.push_back(std::move(future));
210 }
211
212 // 在主线程执行一些其他任务(演示非阻塞)
213 std::cout << "\n主线程可以继续执行其他任务..." << std::endl;
214 std::this_thread::sleep_for(std::chrono::milliseconds(100));
215 std::cout << "主线程的其他工作完成" << std::endl;
216
217 // 等待所有积分任务完成
218 std::cout << "\n等待所有异步任务完成..." << std::endl;
219 for (auto& future : integration_futures) {
220 future.wait();
221 }
222
223 auto end_time = std::chrono::high_resolution_clock::now();
224 auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time);
225
226 // 显示结果
227 std::cout << "\n=== 执行完成 ===" << std::endl;
228 std::cout << "完成的任务: " << parameters.size() << std::endl;
229 std::cout << "总耗时: " << duration.count() << "ms" << std::endl;
230 std::cout << "平均每个任务: " << (duration.count() / parameters.size()) << "ms" << std::endl;
231
232 // 显示优化结果
233 auto best_params = optimizer.get_best_parameters();
234 auto best_objective = optimizer.get_best_objective();
235
236 if (!best_params.empty()) {
237 std::cout << "\n=== 优化结果 ===" << std::endl;
238 std::cout << "最佳参数: [";
239 for (size_t i = 0; i < best_params.size(); ++i) {
240 std::cout << best_params[i];
241 if (i < best_params.size() - 1) std::cout << ", ";
242 }
243 std::cout << "]" << std::endl;
244 std::cout << "最佳目标值: " << best_objective << std::endl;
245 }
246
247 // 显示分析结果
248 const auto& analysis_data = analyzer.get_data();
249 std::cout << "\n收集的分析数据点: " << analysis_data.size() << std::endl;
250
251 // 示例:使用 std::packaged_task 进行更灵活的任务管理
252 std::cout << "\n=== std::packaged_task 示例 ===" << std::endl;
253
254 // 创建一个可以稍后执行的任务
255 std::packaged_task<double(double, double)> task(
256 [](double a, double b) -> double {
257 // 执行一个简单的积分计算
259 [a, b](double t, const std::vector<double>& x, std::vector<double>& dx) {
260 dx[0] = a * x[0] - b * x[0] * x[1];
261 dx[1] = -b * x[1] + a * x[0] * x[1];
262 }
263 );
264
265 std::vector<double> state = {2.0, 1.0};
266 integrator.integrate(state, 0.01, 5.0);
267
268 return std::sqrt(state[0] * state[0] + state[1] * state[1]);
269 }
270 );
271
272 // 获取 future
273 auto result_future = task.get_future();
274
275 // 在另一个线程执行任务
276 std::thread task_thread(std::move(task), 0.6, 0.4);
277
278 // 等待结果
279 double result = result_future.get();
280 std::cout << "Packaged task 结果: " << result << std::endl;
281
282 task_thread.join();
283
284 return 0;
285}
void save_trajectory(const std::vector< double > &final_state, double final_time)
保存轨迹数据
Classical 4th-order Runge-Kutta integrator.
Definition rk4.hpp:19
Modern C++ ODE Integration Library with Real-time Signal Processing.
标准库异步积分示例