級數學習筆記

級數學習筆記

一、數學基礎

1. 數項級數(Number Series)

數項級數是指形如:

∑(n=1 to ∞) a? = a? + a? + a? + ...

的無窮和。

1.1 收斂性判別法
  1. 比較判別法
  2. 比值判別法
  3. 根值判別法
  4. 積分判別法
  5. 萊布尼茨判別法(交錯級數)

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);

四、注意事項

  1. 注意級數的收斂性
  2. 考慮數值精度問題
  3. 設置合適的項數
  4. 注意處理特殊點
  5. 考慮數值溢出問題

五、擴展功能

  1. 添加更多級數類型
  2. 實現更高精度的計算
  3. 添加級數的圖形顯示
  4. 實現級數的解析解
  5. 添加級數的誤差估計
  6. 實現級數的加速收斂
  7. 添加級數的應用示例

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92776.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92776.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92776.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux811 YUM;SHELL:if else fi,for

vsftpdok [rootweb ~]# vim vsftpdok.sh 您在 /var/spool/mail/root 中有新郵件 [rootweb ~]# cat vsftpdok.sh rpm -ql vsftpd >/dev/null 2>&1 if [ $? -eq 0 ];then echo "OK" else yum install vsftpd -y if [ $? -eq 0 ];then echo "install o…

運維學習Day20——MariaDB數據庫管理

文章目錄MariaDB 數據庫管理介紹 MariaDB數據庫介紹數據庫種類關系數據庫MariaDB 介紹部署 MariaDB安裝 MariaDB加固 MariaDB連接 MariaDB配置 MariaDBMariaDB 中 SQL描述 SQL連接數據庫數據庫操作查詢數據庫列表使用數據庫創建數據庫刪除數據庫表操作環境準備查詢表查詢表列表…

itertools:迭代器函數

文章目錄一、合并和分解迭代器1、chain&#xff1a;首尾相接2、zip / zip_longest&#xff1a;對齊取數3、islice&#xff1a;切片4、tee&#xff1a;分裂二、轉換輸入1、map / starmap&#xff1a;函數映射三、生成新值1、count&#xff1a;生成連續整數2、repeat&#xff1a;…

【AI論文】序列標注任務廣義化研究(SFT廣義化):基于獎勵修正的強化學習視角

摘要&#xff1a;我們針對大語言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;的監督微調&#xff08;Supervised Fine-Tuning&#xff0c;SFT&#xff09;提出了一種簡單但具有理論依據的改進方法&#xff0c;以解決其與強化學習&#xff08;Reinforcemen…

(已解決)Mac 終端上配置代理

說明&#xff1a;為了便于理解&#xff0c;本文描述略顯“抽象”與“潦草”&#xff0c;為了過審&#xff0c;僅供學習交流使用。&#x1f680; 簡潔流程版啟動工具 點擊圖標&#xff0c;復制它給出的終端命令將這段內容粘貼進你的配置文件中&#xff08;~/.zshrc 或 ~/.bash_p…

Anti-Aliasing/Mip-NeRF/Zip-NeRF/multi-scale representation

前言 CSDN的文章寫太多&#xff0c;都不記得之前寫的有什么了&#xff0c;但習慣了在這里記錄&#xff0c;先寫上吧。關于multi-scale representation又是看著忘著&#xff0c;還是寫下點什么比較啊。時看時新&#xff0c;還是想吐槽自己看論文太不認真了。下面直接按照文章順序…

板塊三章節3——NFS 服務器

NFS 服務器 NFS 服務介紹 NFS 是Network File System的縮寫&#xff0c;即網絡文件系統&#xff0c;最早由Sun公司開發&#xff0c;**用來在UNIX&Linux系統間實現磁盤文件共享的一種方法。**它的主要功能是通過網絡讓不同的主機系統之間可以共享文件或目錄。NFS客戶端&…

數學建模——最大最小化模型

1.概念最大最小化模型&#xff08;Maximin Model&#xff09;是一種優化方法&#xff0c;旨在最大化最壞情況下的收益或最小化最壞情況下的損失。常見的現實問題有&#xff1a;求最大值的最小化問題最大風險的最低限度最小化最壞情況下的損失等2.一般數學模型 (找最大值里面最小…

【JAVA】使用系統音頻設置播放音頻

代碼直接可以運行 import javax.sound.sampled.*; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets;public class SystemDefaultAudioPlayer {// 強制使用的通用音頻格式private st…

[CSP-J 2021] 小熊的果籃

題目 12代碼 #include <bits/stdc.h> using namespace std; const int N2e55; struct node{int pre,//上一個水果塊(對于水果就是上個水果)l,//塊開始的序號&#xff0c;左邊界 d,//塊類型&#xff0c;0/1id,//水果序號 r,//塊結束的序號&#xff0c;右邊界 next;//下一塊…

【C++】STL二叉搜索樹——map與set容器的基礎結構

目錄 前言 1.二叉搜索樹的概念 1.1基本結構 1.2性能分析 2.二叉搜索樹的實現 2.1創建 2.2插入 2.3查找與遍歷 2.4刪除 3.二叉搜索樹類代碼 前言 C中STL的map與set容器廣泛應用于實踐過程中&#xff0c;本文將詳細分析容器最基礎的二叉搜索樹結構&#xff0c;為后續map…

基于Spring Boot和SSE的實時消息推送系統

一、SSE技術深度解析 1.1 協議工作原理 #mermaid-svg-u7ZBlEsXcn68R5a8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-u7ZBlEsXcn68R5a8 .error-icon{fill:#552222;}#mermaid-svg-u7ZBlEsXcn68R5a8 .error-text{fi…

Day 40 訓練和測試的規范寫法

知識點回顧&#xff1a; 彩色和灰度圖片測試和訓練的規范寫法&#xff1a;封裝在函數中展平操作&#xff1a;除第一個維度batchsize外全部展平dropout操作&#xff1a;訓練階段隨機丟棄神經元&#xff0c;測試階段eval模式關閉dropout 作業&#xff1a;仔細學習下測試和訓練代…

分析代碼并回答問題

代碼 <template><div>Counter: {{ counter }}</div><div>Double Counter: {{ doubleCounter }}</div> </template><script setup lang"ts"> import { ref, computed } from "vue";const counter ref(0);const …

在macOS上掃描192.168.1.0/24子網的所有IP地址

在macOS上掃描192.168.1.0/24子網的所有IP地址&#xff0c;可以通過終端命令實現。以下是幾種常用方法&#xff1a; 使用ping命令循環掃描 打開終端執行以下腳本&#xff0c;會逐個ping測試192.168.1.1到192.168.1.254的地址&#xff0c;并過濾出有響應的IP&#xff1a; for i …

Java基礎05——類型轉換(本文為個人學習筆記,內容整理自嗶哩嗶哩UP主【遇見狂神說】的公開課程。 > 所有知識點歸屬原作者,僅作非商業用途分享)

Java基礎05——類型轉換 類型轉換 由于Java是強類型語言&#xff0c;所以要進行有些運算的時候&#xff0c;需要用到類型轉換。 如&#xff1a;byte(占1個字節)&#xff0c;short(占2個字節)&#xff0c;char(占2個字節)→int(4個字節)→long(占8個字節)→float(占4個字節)→do…

mysql基礎(二)五分鐘掌握全量與增量備份

全量備份 Linux環境 數據備份 數據庫的備份與恢復有多中方法&#xff0c;通過mysql自帶的mysqldump工具可對數據庫進行備份。語法&#xff1a; mysqldump -u username -p password --databases db_name > file_name .sql說明&#xff1a; -u參數指定用戶名&#xff0c;usern…

使用Windbg分析多線程死鎖項目實戰問題分享

目錄 1、問題描述 2、使用.effmach x86命令切換到32位上下文 3、切換到UI線程&#xff0c;發現UI線程死鎖了 4、使用!locks命令查看臨界區鎖的詳細信息&#xff0c;遇到了問題 5、使用dt命令查看臨界區對象信息&#xff0c;找到發生死鎖的多個線程 6、用戶態鎖與內核態鎖…

防火墻組網方式總結

一、部署模式&#xff1a;靈活適配多樣網絡環境下一代防火墻&#xff08;NGAF&#xff09;具備極強的網絡適應能力&#xff0c;支持五種核心部署模式&#xff0c;可根據不同網絡需求靈活選擇。路由模式&#xff1a;防火墻相當于路由器&#xff0c;位于內外網之間負責路由尋址&a…

AI大模型:(二)5.1 文生視頻(Text-to-Video)模型發展史

目錄 1.介紹 2.發展歷史 2.1.早期探索階段(2015-2019) 2.1.1.技術萌芽期 2.1.2.RNN/LSTM時代 2.2.技術突破期(2020-2021) 2.2.1 Transformer引入視頻生成 2.2.2 擴散模型的興起 2.3.商業化突破期(2022-2023) 2.3.1 產品化里程碑 2.3.2 競爭格局形成 2.4.革命…