diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt
index f7e0244..3b54ae2 100644
--- a/example/CMakeLists.txt
+++ b/example/CMakeLists.txt
@@ -17,4 +17,5 @@ add_example(ex4 ON)
add_example(ex5 ON)
add_example(ex6 ON)
add_example(ex7 ON)
-add_example(ex8 ON)
\ No newline at end of file
+add_example(ex8 ON)
+add_example(ex9 ON)
\ No newline at end of file
diff --git a/example/ex9.cpp b/example/ex9.cpp
new file mode 100644
index 0000000..f177430
--- /dev/null
+++ b/example/ex9.cpp
@@ -0,0 +1,75 @@
+/********************************************************
+ * ██████╗ ███████╗████████╗██╗
+ * ██╔════╝ ██╔════╝╚══██╔══╝██║
+ * ██║ ███╗███████╗ ██║ ██║
+ * ██║ ██║╚════██║ ██║ ██║
+ * ╚██████╔╝███████║ ██║ ███████╗
+ * ╚═════╝ ╚══════╝ ╚═╝ ╚══════╝
+ * Generic Scientific Template Library
+ *
+ * Copyright (c) 2022 Yi Zhang (yizhang-geo@zju.edu.cn)
+ *
+ * The GSTL is distributed under a dual licensing scheme. You can redistribute
+ * it and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either version 2
+ * of the License, or (at your option) any later version. You should have
+ * received a copy of the GNU Lesser General Public License (LGPL) along with
+ * this program. If not, see .
+ *
+ * If the terms and conditions of the LGPL v.2. would prevent you from using
+ * the GSTL, please consider the option to obtain a commercial license for a
+ * fee. These licenses are offered by the GSTL's original author. As a rule,
+ * licenses are provided "as-is", unlimited in time for a one time fee. Please
+ * send corresponding requests to: yizhang-geo@zju.edu.cn. Please do not forget
+ * to include some description of your company and the realm of its activities.
+ * Also add information on how to contact you by electronic and paper mail.
+ ******************************************************/
+
+#include "../lib/optimization.h"
+
+using namespace gctl;
+
+class ex9 : public lgd_solver
+{
+private:
+ /* data */
+public:
+ ex9(){}
+ virtual ~ex9(){}
+
+ virtual double LGD_Evaluate(const array &x, array &g){return 0.0;}
+};
+
+int main(int argc, char const *argv[])
+{
+ ex9 e;
+
+ lgd_para p = e.default_lgd_para();
+ p.beta = 1.2;
+ e.set_lgd_para(p);
+
+ array dist;
+ e.get_levy_distribution(dist, 125);
+
+ double m = dist.mean();
+ double s = dist.std();
+
+ int c = 0;
+ for (size_t i = 0; i < dist.size(); i++)
+ {
+ if (dist[i] > m + 3*s) c++;
+ }
+
+ std::cout << "mean = " << dist.mean() << "\n";
+ std::cout << "std = " << dist.std() << "\n";
+ std::cout << "rms = " << dist.rms() << "\n";
+ std::cout << "max = " << dist.max() << "\n";
+ std::cout << "min = " << dist.min() << "\n";
+ std::cout << "ratio = " << 5000.0*c/dist.size() << "\n";
+
+ for (size_t i = 0; i < dist.size(); i++)
+ {
+ std::clog << dist[i] << "\n";
+ }
+ return 0;
+}
diff --git a/lib/optimization/lgd.cpp b/lib/optimization/lgd.cpp
index f517797..6edfd93 100644
--- a/lib/optimization/lgd.cpp
+++ b/lib/optimization/lgd.cpp
@@ -154,6 +154,31 @@ void gctl::lgd_solver::save_lgd_trace(std::string trace_file)
return;
}
+gctl::lgd_return_code gctl::lgd_solver::get_levy_distribution(array &dist, unsigned int seed)
+{
+ if (lgd_param_.flight_times <= 0) return LGD_INVALID_MAX_ITERATIONS;
+ if (lgd_param_.beta <= 1.0 || lgd_param_.beta >= 2.0) return LGD_INVALID_BETA;
+
+ double gamma1 = tgamma(lgd_param_.beta + 1.0);
+ double gamma2 = tgamma(0.5*(lgd_param_.beta + 1.0));
+ double stddev_u = pow((gamma1*sin(0.5*GCTL_Pi*lgd_param_.beta))/
+ (gamma2*lgd_param_.beta*pow(2, 0.5*(lgd_param_.beta-1.0))), 1.0/lgd_param_.beta);
+
+ if (seed == 0) seed = std::chrono::system_clock::now().time_since_epoch().count();
+ std::default_random_engine generator(seed);
+ std::normal_distribution dist_u(0, stddev_u);
+ std::normal_distribution dist_v(0, lgd_param_.stddev_v);
+ std::uniform_real_distribution dist_s(1.0, 2.0);
+
+ dist.resize(lgd_param_.flight_times);
+ for (int i = 0; i <= lgd_param_.flight_times; i++)
+ {
+ dist[i] = fabs(dist_u(generator)/pow(fabs(dist_v(generator)), 1.0/lgd_param_.beta));
+ }
+
+ return LGD_REACHED_MAX_ITERATIONS;
+}
+
void gctl::lgd_solver::lgd_error_str(lgd_return_code err_code, std::ostream &ss, bool err_throw)
{
#if defined _WINDOWS || __WIN32__
diff --git a/lib/optimization/lgd.h b/lib/optimization/lgd.h
index 19b6700..c6c7d2f 100644
--- a/lib/optimization/lgd.h
+++ b/lib/optimization/lgd.h
@@ -172,6 +172,16 @@ namespace gctl
// saved if the recording threshold is set.
void save_lgd_trace(std::string trace_file);
+ /**
+ * @brief 按照levy分布采样一组数据,参数可通过set_lgd_para函数设置
+ *
+ * @param dist 返回的levy分布
+ * @param seed 随机种子
+ *
+ * @return 状态代码
+ */
+ lgd_return_code get_levy_distribution(array &dist, unsigned int seed = 0);
+
lgd_para default_lgd_para();
void set_lgd_para(const lgd_para ¶m);