级数学习笔记

一、数学基础

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.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.革命…