級數學習筆記
一、數學基礎
1. 數項級數(Number Series)
數項級數是指形如:
∑(n=1 to ∞) a? = a? + a? + a? + ...
的無窮和。
1.1 收斂性判別法
- 比較判別法
- 比值判別法
- 根值判別法
- 積分判別法
- 萊布尼茨判別法(交錯級數)
2. 冪級數(Power Series)
冪級數是指形如:
∑(n=0 to ∞) a?(x-x?)? = a? + a?(x-x?) + a?(x-x?)2 + ...
的級數。
2.1 收斂半徑
對于冪級數,存在收斂半徑R,使得:
- 當|x-x?| < R時,級數絕對收斂
- 當|x-x?| > R時,級數發散
- 當|x-x?| = R時,需要單獨判斷
3. 泰勒級數(Taylor Series)
函數f(x)在點x?處的泰勒級數展開:
f(x) = ∑(n=0 to ∞) [f???(x?)/n!] (x-x?)?
4. 傅里葉級數(Fourier Series)
周期函數f(x)的傅里葉級數展開:
f(x) = a?/2 + ∑(n=1 to ∞) [a?cos(nx) + b?sin(nx)]
其中:
a? = (1/π)∫(-π to π) f(x)cos(nx)dx
b? = (1/π)∫(-π to π) f(x)sin(nx)dx
二、代碼實現
1. 頭文件 (series.h)
#ifndef SERIES_H
#define SERIES_H#include <functional>
#include <vector>
#include <cmath>
#include <stdexcept>/*** @class Series* @brief 級數計算類* * 用于計算各種級數的和、收斂性等。*/
class Series {
public:// 計算數項級數的部分和static double partialSum(const std::function<double(int)>& term,int n);// 判斷數項級數的收斂性static bool isConvergent(const std::function<double(int)>& term,double epsilon = 1e-6,int max_terms = 1000);// 計算冪級數的收斂半徑static double convergenceRadius(const std::function<double(int)>& coefficient,double epsilon = 1e-6,int max_terms = 100);// 計算冪級數的和static double powerSeriesSum(const std::function<double(int)>& coefficient,double x,double x0,int n);// 計算泰勒級數展開static std::vector<double> taylorSeries(const std::function<double(double)>& func,const std::function<double(double, int)>& derivative,double x0,int n);// 計算傅里葉級數系數static std::pair<std::vector<double>, std::vector<double>> fourierCoefficients(const std::function<double(double)>& func,int n,double period = 2 * M_PI);// 計算傅里葉級數的和static double fourierSeriesSum(const std::vector<double>& a,const std::vector<double>& b,double x,int n);private:// 輔助函數:計算階乘static double factorial(int n);// 輔助函數:計算組合數static double combination(int n, int k);// 輔助函數:計算積分static double integrate(const std::function<double(double)>& func,double a,double b,int n = 1000);
};#endif // SERIES_H
2. 實現文件 (series.cpp)
#include "series.h"
#include <algorithm>
#include <numeric>double Series::partialSum(const std::function<double(int)>& term,int n
) {double sum = 0.0;for (int i = 1; i <= n; ++i) {sum += term(i);}return sum;
}bool Series::isConvergent(const std::function<double(int)>& term,double epsilon,int max_terms
) {double sum = 0.0;double prev_sum = 0.0;for (int i = 1; i <= max_terms; ++i) {sum += term(i);if (std::abs(sum - prev_sum) < epsilon) {return true;}prev_sum = sum;}return false;
}double Series::convergenceRadius(const std::function<double(int)>& coefficient,double epsilon,int max_terms
) {double r = 0.0;double prev_r = 0.0;for (int n = 1; n <= max_terms; ++n) {double a_n = coefficient(n);double a_n_plus_1 = coefficient(n + 1);if (std::abs(a_n_plus_1) < epsilon) {r = std::numeric_limits<double>::infinity();break;}r = std::abs(a_n / a_n_plus_1);if (std::abs(r - prev_r) < epsilon) {break;}prev_r = r;}return r;
}double Series::powerSeriesSum(const std::function<double(int)>& coefficient,double x,double x0,int n
) {double sum = 0.0;double power = 1.0;for (int i = 0; i <= n; ++i) {sum += coefficient(i) * power;power *= (x - x0);}return sum;
}std::vector<double> Series::taylorSeries(const std::function<double(double)>& func,const std::function<double(double, int)>& derivative,double x0,int n
) {std::vector<double> coefficients(n + 1);for (int i = 0; i <= n; ++i) {coefficients[i] = derivative(x0, i) / factorial(i);}return coefficients;
}std::pair<std::vector<double>, std::vector<double>> Series::fourierCoefficients(const std::function<double(double)>& func,int n,double period
) {std::vector<double> a(n + 1);std::vector<double> b(n + 1);// 計算a?a[0] = integrate(func, -period/2, period/2) / period;// 計算a?和b?for (int i = 1; i <= n; ++i) {auto cos_term = [&](double x) {return func(x) * std::cos(2 * M_PI * i * x / period);};auto sin_term = [&](double x) {return func(x) * std::sin(2 * M_PI * i * x / period);};a[i] = 2 * integrate(cos_term, -period/2, period/2) / period;b[i] = 2 * integrate(sin_term, -period/2, period/2) / period;}return {a, b};
}double Series::fourierSeriesSum(const std::vector<double>& a,const std::vector<double>& b,double x,int n
) {double sum = a[0] / 2;for (int i = 1; i <= n; ++i) {sum += a[i] * std::cos(2 * M_PI * i * x) +b[i] * std::sin(2 * M_PI * i * x);}return sum;
}double Series::factorial(int n) {if (n < 0) {throw std::invalid_argument("Factorial is not defined for negative numbers");}double result = 1.0;for (int i = 2; i <= n; ++i) {result *= i;}return result;
}double Series::combination(int n, int k) {if (k < 0 || k > n) {return 0.0;}double result = 1.0;for (int i = 1; i <= k; ++i) {result *= (n - k + i) / i;}return result;
}double Series::integrate(const std::function<double(double)>& func,double a,double b,int n
) {double h = (b - a) / n;double sum = (func(a) + func(b)) / 2;for (int i = 1; i < n; ++i) {sum += func(a + i * h);}return h * sum;
}
3. 示例程序 (series_demo.cpp)
#include "series.h"
#include <iostream>
#include <iomanip>
#include <cmath>// 打印向量
void printVector(const std::vector<double>& v, const std::string& name) {std::cout << name << " = [";for (size_t i = 0; i < v.size(); ++i) {std::cout << std::fixed << std::setprecision(6) << v[i];if (i < v.size() - 1) std::cout << ", ";}std::cout << "]" << std::endl;
}int main() {try {// 1. 數項級數示例// 計算調和級數的部分和auto harmonic_term = [](int n) { return 1.0 / n; };double harmonic_sum = Series::partialSum(harmonic_term, 10);std::cout << "調和級數的前10項和 = " << harmonic_sum << std::endl;// 判斷調和級數的收斂性bool is_harmonic_convergent = Series::isConvergent(harmonic_term);std::cout << "調和級數是否收斂: " << (is_harmonic_convergent ? "是" : "否") << std::endl;// 2. 冪級數示例// 計算幾何級數的收斂半徑auto geometric_coef = [](int n) { return 1.0; };double radius = Series::convergenceRadius(geometric_coef);std::cout << "幾何級數的收斂半徑 = " << radius << std::endl;// 計算幾何級數的和double geometric_sum = Series::powerSeriesSum(geometric_coef, 0.5, 0.0, 10);std::cout << "幾何級數在x=0.5處的和 = " << geometric_sum << std::endl;// 3. 泰勒級數示例// 計算e^x的泰勒級數展開auto exp_func = [](double x) { return std::exp(x); };auto exp_derivative = [](double x, int n) { return std::exp(x); };auto taylor_coef = Series::taylorSeries(exp_func, exp_derivative, 0.0, 5);printVector(taylor_coef, "e^x的泰勒級數系數");// 4. 傅里葉級數示例// 計算方波的傅里葉級數auto square_wave = [](double x) {return std::abs(std::fmod(x, 2 * M_PI)) < M_PI ? 1.0 : -1.0;};auto [a, b] = Series::fourierCoefficients(square_wave, 5);printVector(a, "方波的傅里葉系數a");printVector(b, "方波的傅里葉系數b");// 計算方波的傅里葉級數和double fourier_sum = Series::fourierSeriesSum(a, b, M_PI/4, 5);std::cout << "方波在x=π/4處的傅里葉級數和 = " << fourier_sum << std::endl;} catch (const std::exception& e) {std::cerr << "錯誤: " << e.what() << std::endl;return 1;}return 0;
}
4. Makefile
CXX = g++
CXXFLAGS = -std=c++17 -Wall -Wextra -O2all: series_demoseries_demo: series_demo.o series.o$(CXX) $(CXXFLAGS) -o $@ $^series_demo.o: series_demo.cpp series.h$(CXX) $(CXXFLAGS) -c $<series.o: series.cpp series.h$(CXX) $(CXXFLAGS) -c $<clean:rm -f *.o series_demo.PHONY: all clean
三、使用說明
1. 編譯
使用提供的Makefile編譯項目:
make
2. 運行示例
./series_demo
3. 基本用法
// 計算數項級數的部分和
double sum = Series::partialSum(term_func, n);// 判斷級數的收斂性
bool is_convergent = Series::isConvergent(term_func);// 計算冪級數的收斂半徑
double radius = Series::convergenceRadius(coef_func);// 計算冪級數的和
double sum = Series::powerSeriesSum(coef_func, x, x0, n);// 計算泰勒級數展開
auto coef = Series::taylorSeries(func, derivative, x0, n);// 計算傅里葉級數系數
auto [a, b] = Series::fourierCoefficients(func, n);// 計算傅里葉級數的和
double sum = Series::fourierSeriesSum(a, b, x, n);
四、注意事項
- 注意級數的收斂性
- 考慮數值精度問題
- 設置合適的項數
- 注意處理特殊點
- 考慮數值溢出問題
五、擴展功能
- 添加更多級數類型
- 實現更高精度的計算
- 添加級數的圖形顯示
- 實現級數的解析解
- 添加級數的誤差估計
- 實現級數的加速收斂
- 添加級數的應用示例