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];
45 std::vector<std::pair<std::vector<double>,
double>> data_;
46 mutable std::mutex data_mutex_;
49 void analyze_result(
const std::vector<double>& final_state,
double final_time) {
50 std::lock_guard<std::mutex> lock(data_mutex_);
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]);
56 std::cout <<
"分析结果: 幅度=" << magnitude
57 <<
", 稳定性=" << stability
58 <<
", 时间=" << final_time << std::endl;
60 data_.emplace_back(final_state, final_time);
63 const std::vector<std::pair<std::vector<double>,
double>>& get_data()
const {
64 std::lock_guard<std::mutex> lock(data_mutex_);
73 std::atomic<size_t> counter_{0};
76 explicit TrajectorySaver(std::string prefix =
"traj_") : prefix_(std::move(prefix)) {}
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";
83 std::cout <<
"保存轨迹: " << filename
84 <<
" (状态: [" << final_state[0] <<
", " << final_state[1]
85 <<
"], 时间: " << final_time <<
")" << std::endl;
92 std::vector<double> best_params_;
93 double best_objective_{std::numeric_limits<double>::max()};
94 mutable std::mutex optimizer_mutex_;
97 void update_parameters(
const std::vector<double>& params,
double objective_value) {
98 std::lock_guard<std::mutex> lock(optimizer_mutex_);
100 if (objective_value < best_objective_) {
101 best_objective_ = objective_value;
102 best_params_ = params;
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 <<
", ";
109 std::cout <<
"], 目标值: " << objective_value << std::endl;
113 std::vector<double> get_best_parameters()
const {
114 std::lock_guard<std::mutex> lock(optimizer_mutex_);
118 double get_best_objective()
const {
119 std::lock_guard<std::mutex> lock(optimizer_mutex_);
120 return best_objective_;
127 SetConsoleOutputCP(CP_UTF8);
130 std::cout <<
"=== 标准库异步积分示例 ===" << std::endl;
131 std::cout <<
"展示如何直接使用标准库设施进行异步计算" << std::endl;
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}
144 std::cout <<
"\n启动 " << parameters.size() <<
" 个异步积分任务..." << std::endl;
147 std::vector<std::future<void>> integration_futures;
149 auto start_time = std::chrono::high_resolution_clock::now();
152 for (
size_t i = 0; i < parameters.size(); ++i) {
153 const auto& [alpha, beta] = parameters[i];
156 auto future = std::async(std::launch::async,
157 [&analyzer, &saver, &optimizer, alpha, beta, i]() {
162 [system](
double t,
const std::vector<double>& x, std::vector<double>& dx) {
168 std::vector<double> state = {1.0, 0.5};
169 integrator.integrate(state, 0.01, 10.0);
171 std::cout <<
"任务 " << i <<
" 积分完成 (α=" << alpha <<
", β=" << beta <<
")" << std::endl;
174 std::vector<std::future<void>> post_futures;
177 post_futures.push_back(std::async(std::launch::async,
178 [&analyzer, state, time = integrator.current_time()]() {
179 analyzer.analyze_result(state, time);
184 post_futures.push_back(std::async(std::launch::async,
185 [&saver, state, time = integrator.current_time()]() {
186 saver.save_trajectory(state, time);
191 double objective = std::abs(state[0] - state[1]);
192 std::vector<double> params = {alpha, beta};
194 post_futures.push_back(std::async(std::launch::async,
195 [&optimizer, params, objective]() {
196 optimizer.update_parameters(params, objective);
201 for (
auto& f : post_futures) {
205 std::cout <<
"任务 " << i <<
" 后处理完成" << std::endl;
209 integration_futures.push_back(std::move(future));
213 std::cout <<
"\n主线程可以继续执行其他任务..." << std::endl;
214 std::this_thread::sleep_for(std::chrono::milliseconds(100));
215 std::cout <<
"主线程的其他工作完成" << std::endl;
218 std::cout <<
"\n等待所有异步任务完成..." << std::endl;
219 for (
auto& future : integration_futures) {
223 auto end_time = std::chrono::high_resolution_clock::now();
224 auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time);
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;
233 auto best_params = optimizer.get_best_parameters();
234 auto best_objective = optimizer.get_best_objective();
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 <<
", ";
243 std::cout <<
"]" << std::endl;
244 std::cout <<
"最佳目标值: " << best_objective << std::endl;
248 const auto& analysis_data = analyzer.get_data();
249 std::cout <<
"\n收集的分析数据点: " << analysis_data.size() << std::endl;
252 std::cout <<
"\n=== std::packaged_task 示例 ===" << std::endl;
255 std::packaged_task<double(
double,
double)> task(
256 [](
double a,
double b) ->
double {
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];
265 std::vector<double> state = {2.0, 1.0};
266 integrator.integrate(state, 0.01, 5.0);
268 return std::sqrt(state[0] * state[0] + state[1] * state[1]);
273 auto result_future = task.get_future();
276 std::thread task_thread(std::move(task), 0.6, 0.4);
279 double result = result_future.get();
280 std::cout <<
"Packaged task 结果: " << result << std::endl;
void save_trajectory(const std::vector< double > &final_state, double final_time)
保存轨迹数据
Classical 4th-order Runge-Kutta integrator.
Modern C++ ODE Integration Library with Real-time Signal Processing.