数值分析:三次样条插值算法(Cubic Spline Interpolation)
龙格现象(Runge Phenomenon)
在对数据进行估计时往往有拟合和插值两种方法,拟合只会尽量估计数据集的整体分布趋势,不会确保经过所有的样本点,而插值会经过所有的样本点,但一般而言线性插值产生折线效果,其一阶导数不连续,往往使用高阶插值,但高阶插值可能产生龙格现象,龙格现象指的是均匀分布的插值点函数阶数升高,在多项式端点处可能造成振荡,产生严重误差,龙格现象的原因剖析详见龙格现象,解决这种现象可以通过引入高斯或切比雪夫插值点,或者使用分段的插值进行解决。
三次样条插值(Cubic
Spline Interpolation)
样条插值源自工程制图,其通过固定的钉子,将柔软的木条固定:
引入数学,木条的函数可以由分段的端点函数进行表示,保证了整体函数的光滑性,三次样条插值在数学上是一个三次分段函数:
可见其有4n个方程参数,但只能建立4n-2个方程.
具体而言,根据函数连续性,n+1个端点,可建立2n个方程(两侧端点只能各建立一个方程):
因为函数光滑,其除两侧外的端点满足二阶导数连续、一阶导数连续,分别建立n-1个方程:
剩下两个条件根据边界 ...
(Private)基于C++ boost与ZeroMQ远程发布订阅远程调用网络设计
103c704d716c2a6b4b59a60c7b698e01e267a92d601a60f130246c8b57cc624a9933f09653cb8ae792d31f011500a065940fb391eecc0e17d2bd57d1fab6c0d1144c1f5c92ed1ba36ff05a279c108cdb29a273c67cdf35956c598ad27624052eaaac6b2338574150321a002a8a0878375ebbe3d163ea7a99f3ce3203c1def7dfa2563feff714e05bb34da4b7a72c21f3aea0edcf962574c062693b88246c17ee094d52dd6b8f042a7fad72d03347641eaa692961827d585413604ae6c348bbee1099a3511768b4c8b51f427356888e316b44a1837d02a04138141fcd6020745f3b738390a3ac6b71866ac3eb080b9aff41640e08c908d7c01 ...
boost库开发笔记(五):boost库杂记
记录了boost库一些特别的设计。
boost::program_options
命令行解析:基本类型支持
boost::program_options可以用于解析命令行参数,常常被用于解析项目运行命令、配置文件、环境变量等到boost::program_options::variables_map,这个map是一个string-boost::program_options::variable_value的键值对集合,variable_value.as<T>()方法能够将其转换到基本数据类型,以及std::vector<T>以及自定义结构体等,见下文。
一个简单实例如下: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748#include <iostream>#include <boost/program_options.hpp>using namespace std;namespace program_op ...
boost库开发笔记(四):boost::property_tree的json与ini封装与解析
boost::property_tree::ptree
boost::property_tree::ptree是一种树结构,其本质相当于(注意这不是定义式):
1234struct basic_ptree{ string data; basic_ptree* next;};
可见其结构上就是一种树/链表,适合用于解析嵌套的键值对文件,如json、ini等。
json
json方法基本没有可参考性,看不看都行,真是脑子被踢了才会学。
json解析
json解析首选仍然是boost::json库,因为其支持类型检查、序列化等,ptree基本只能解析结构相对简单、且知道值类型的(或者类型比较统一的)json结构,了解基本接口即可:
其中get_child表示获取子节点,得到的是一个新的ptree对象,对于一般数据类型,遍历ptree,迭代器是一个pair对象:std::pair<string, property_tree::ptree>,若second为空,意味着无子节点(注意ptree.second.empty成立,指的是ptre ...
boost库开发笔记(三):boost::beast websocket异步网络编程
boost::beast
boost::beast是一个基于boost::asio封装的一个网络编程库,与asio注重网络底层不同,beast专注于搭建Http和WebSocket服务器框架,其完全由C++实现,支持零拷贝、异步、多线程、协程等,性能极高,支持ssl/tls加密等,但它的缺点也来自C++,例如开箱即用的轮子少、编译时间较长、更注重底层使得应用层兼容性一般、较繁杂的错误处理机制。
示例来自官方示例。
同步服务器-客户端
服务器端:比asio中的示例多了几步,首先是使用socket初始化一个websocket的流对象,设置其http响应头:websocket的连接建立是通过http握手开始的:
websocket的http握手
客户端发送消息: 1234GET /index.html HTTP/1.1 #起始行Host: www.example.com #HTTP 头(Header)User-Agent: Mozilla/5.0Accept: text/html
服务器响应: 123HTTP/1.1 200 OK #起始行Content-Type: text/ ...
网络编程库:C++ ZeroMQ学习笔记
ZeroMQ是一个高性能、跨语言的网络编程框架,许多人称其命名为MQ并不准确,因为ZeroMQ已经超越消息队列范畴,完全是一种高抽象的Socket,原生使用C语言进行撰写,随即涵盖到基本几十种的开发语言中,当然包括C++/Java/Go/Python/Rust等。
ZeroMQ在2007年由比利时软件设计师皮特·亨特金斯(Pieter
Hintjens)及其公司团队开发,旨在提高消息中间件的易用性和性能,也由于此ZeroMQ推出几年间逐渐受到社区关注,在许多大型交易系统得到应用。2016年,身患癌症的亨特金斯在比利时接受安乐死,但他的作品仍然活跃以及被持续维护在十年后的今天,致敬。
ZeroMQ的设计思想十分精巧,虽然从今天视角来看许多艺术已经是非常惯用的设计,这些在英文文档Zguide中展示得详尽且淋漓尽致,详见:https://zguide.zeromq.org,暂未找到近年的中文翻译版本。
本文以Zguide示例为蓝本,完成了C++基本示例的阐述,仅集中于前五章基本设计,更多架构设计哲学参考原文,原文示例仓库来自:https://github.com/imatix/zgu ...
C++ 11 新特性总结(五):tuple元组类型
元组类型
C++越来越往Python方向靠近,以致习惯上回到纯C的时代开始使人无比痛苦。
是的,C++
11引入了元组支持,支持将任意数量的类型封装成单一对象,且在C++
17引入了auto[x,y,z] = t简单的解包方法;tuple没有size和type成员,需要std::tuple_size和std::tuple_element结合类型推导或萃取来获取大小和类型,以下:
1234567891011121314151617181920212223242526#include <iostream>#include <tuple>#include <type_traits>using namespace std;int main(){ //构造方式一: std::tuple<int, std::string, double> mytuple(0, "Eden", 1.2); //解包: cout << std::get<0>(mytuple) < ...
【sem_timedwait问题解决】系统时间向前跳变导致sem_timedwait长久阻塞
问题概述
系统时间跳变会导致一些系统时间依赖函数的异常工作,一个例子是sem_timedwait。当处于sem_timedwait阻塞等待时,如果此时系统时间跳变到起始时间之前:
1sudo date -s "2025-06-30 9:40:00" //修改系统时间
那么sem_timedwait会处于持续的阻塞状态,sem_timedwait不会返回,也不会产生任何打印效果,如下代码:
1234567891011121314151617181920212223242526272829#include <iostream>#include <time.h>#include <semaphore.h>#include <thread>using namespace std;struct timespec ts{};int main(){ sem_t sem_; sem_init(&sem_,0,0); while(true){ clo ...
boost库开发笔记(二):boost::asio异步网络编程
boost::asio
boost::asio是C++高级异步网络编程库,主要用于异步编程、调度和通讯,包括定时器、信号处理、异步执行、socket等基本功能。
本文围绕了asio入门的基础、常用接口部件等进行讨论,从简单的asio对象开始,分成异步编程和网络编程两大板块,并且相应地结合源码进行记录。本文会随着项目进展更新,相信会成为比较完备的ASIO入门体系。
boost::asio异步编程
asio::io_context
每个asio程序至少存在一个io_context对象(boost
1.66前称io_service),io_context是asio工作的核心,其提供了一个事件循环队列机制(类似Qt),作为调度器完成事件调度;io_context本身不直接与通信对象通信,而是管理一系列IO资源如定时器、socket等。
asio定时器
asio支持三种定时器,为asio::system_timer、asio::steady_timer和asio::high_resolution_timer,另一种旧版本的deadline_timer已经被弃用;其中:
as ...
C++ 11 新特性总结(四):enable_from_this/shared_from_this
问题起源
问题来自std::shared_ptr,为了保证shared_ptr的计数正确,只允许使用一个智能指针对象去使用裸指针构造,因此这样的代码是错误的:
123Person* p = new Person();std::shared_ptr<Person> p1(p);std::shared_ptr<Person> p2(p);
其后果是p在new时候执行了一次构造,p1和p2都认为自己管理了p,因此两个共享指针独立的控制块都显示引用数为1,所以析构时各自执行一次,导致双重删除:
123Person constructor called!Person destructor called!Person destructor called!
显式上我们不会这么干,但是有一些隐晦的写法还是触碰到这条红线,例如:
123456789101112131415161718192021222324#include <iostream>#include <memory>using namespace std;class Person ...