最近写算法程序,发现有一些底层的程序看着貌似简单,想要把效果做的很好还是很难,之前都没总结过。以至于之前即使用过也还得重新再写,写个基于C语言的程序集锦,供参考。

1、三次样条插值

基本原理这里就不讲了,直接上程序,复制后可以直接使用。

#include "spline.h"
#include <math.h>static int spline(   int n, int end1, int end2,double slope1, double slope2,double x[], double y[],double b[], double c[], double d[],int *iflag)
{int nm1, ib, i, ascend;double t;nm1 = n - 1;*iflag = 0;if (n < 2){ /* no possible interpolation */*iflag = 1;goto LeaveSpline;}ascend = 1;for (i = 1; i < n; ++i) if (x[i] <= x[i - 1]) ascend = 0;if (!ascend){*iflag = 2;goto LeaveSpline;}if (n >= 3){d[0] = x[1] - x[0];c[1] = (y[1] - y[0]) / d[0];for (i = 1; i < nm1; ++i){d[i] = x[i + 1] - x[i];b[i] = 2.0 * (d[i - 1] + d[i]);c[i + 1] = (y[i + 1] - y[i]) / d[i];c[i] = c[i + 1] - c[i];}/* ---- Default End conditions */b[0] = -d[0];b[nm1] = -d[n - 2];c[0] = 0.0;c[nm1] = 0.0;if (n != 3){c[0] = c[2] / (x[3] - x[1]) - c[1] / (x[2] - x[0]);c[nm1] = c[n - 2] / (x[nm1] - x[n - 3]) - c[n - 3] / (x[n - 2] - x[n - 4]);c[0] = c[0] * d[0] * d[0] / (x[3] - x[0]);c[nm1] = -c[nm1] * d[n - 2] * d[n - 2] / (x[nm1] - x[n - 4]);}/* Alternative end conditions -- known slopes */if (end1 == 1){b[0] = 2.0 * (x[1] - x[0]);c[0] = (y[1] - y[0]) / (x[1] - x[0]) - slope1;}if (end2 == 1){b[nm1] = 2.0 * (x[nm1] - x[n - 2]);c[nm1] = slope2 - (y[nm1] - y[n - 2]) / (x[nm1] - x[n - 2]);}/* Forward elimination */for (i = 1; i < n; ++i){t = d[i - 1] / b[i - 1];b[i] = b[i] - t * d[i - 1];c[i] = c[i] - t * c[i - 1];}/* Back substitution */c[nm1] = c[nm1] / b[nm1];for (ib = 0; ib < nm1; ++ib){i = n - ib - 2;c[i] = (c[i] - d[i] * c[i + 1]) / b[i];}b[nm1] = (y[nm1] - y[n - 2]) / d[n - 2] + d[n - 2] * (c[n - 2] + 2.0 * c[nm1]);for (i = 0; i < nm1; ++i){b[i] = (y[i + 1] - y[i]) / d[i] - d[i] * (c[i + 1] + 2.0 * c[i]);d[i] = (c[i + 1] - c[i]) / d[i];c[i] = 3.0 * c[i];}c[nm1] = 3.0 * c[nm1];d[nm1] = d[n - 2];}else{b[0] = (y[1] - y[0]) / (x[1] - x[0]);c[0] = 0.0;d[0] = 0.0;b[1] = b[0];c[1] = 0.0;d[1] = 0.0;}
LeaveSpline:return 0;
}static double seval(int ni, double u,int n, double x[], double y[],double b[], double c[], double d[],int *last)
{int i, j, k;double w;i = *last;if (i >= n - 1) i = 0;if (i < 0) i = 0;if ((x[i] > u) || (x[i + 1] < u))//??{i = 0;j = n;do{k = (i + j) / 2;if (u < x[k]) j = k;if (u >= x[k]) i = k;} while (j > i + 1);}*last = i;w = u - x[i];w = y[i] + w * (b[i] + w * (c[i] + w * d[i]));return (w);
}void SPL(int n, double *x, double *y, int ni, double *xi, double *yi)
{double *b, *c, *d;int iflag=0, last=0, i=0;b = (double *)malloc(sizeof(double) * n);c = (double *)malloc(sizeof(double) * n);d = (double *)malloc(sizeof(double) * n);if (!d) { printf("no enough memory for b,c,d\n"); }else {spline(n, 0, 0, 0, 0, x, y, b, c, d, &iflag);if (iflag == 0) printf("I got coef b,c,d now\n"); else printf("x not in order or other error\n");for (i = 0; i<ni; i++) yi[i] = seval(ni, xi[i], n, x, y, b, c, d, &last);free(b); free(c); free(d);};
}int main()
{/* Sin插值 */double x[7] = { 0, 1, 2, 3, 4, 5, 6 };double y[7] = { 0, 0.841470984807897, 0.909297426825682, 0.141120008059867, -0.756802495307928, -0.958924274663139, -0.279415498198926 };double u[61] = { 0 };double s[61] = { 0 };int i;for (i = 0; i < 61; i++){u[i] = (double)i*0.1;}SPL(7, x, y, 61, u, s);/*在这里就可以打印插值后的数据*/return 0;
}

图1 数值实验结果

持续更新中。。。

简单算法集锦(程序)相关推荐

  1. c语言有啥简单的小程序,c语言-简单小程序-简单算法

    <c语言-简单小程序-简单算法>由会员分享,可在线阅读,更多相关<c语言-简单小程序-简单算法(19页珍藏版)>请在人人文库网上搜索. 1.以下小程序都在 TC2.0 中运行通 ...

  2. Kalman滤波算法详细推导及简单匀速直线运动程序仿真(matlab)

    Kalman滤波算法详细推导及简单匀速直线运动程序仿真(matlab) 起初只是知道Kalman滤波的核心公式和会用,没有仔细研究,最近老师让讲Kalman算法,所以系统的学习了该算法,并结合匀速直线 ...

  3. JAVA 判断简单密码算法_十道简单算法题二【Java实现】

    前言 清明不小心就拖了两天没更了-- 这是十道算法题的第二篇了-上一篇回顾:十道简单算法题 最近在回顾以前使用C写过的数据结构和算法的东西,发现自己的算法和数据结构是真的薄弱,现在用Java改写一下, ...

  4. matlab 算法集锦

    算法集锦 决策树-划分点 function [n,h]=huafendian1(x) %n返回增益 %h返回划分点 %假设0代表第一类 %假设1代表第二类 %输入x第一列为属性,第二列为用于学习的分类 ...

  5. python算法与程序设计基础第二版-算法与程序设计基础(Python版) - 吴萍

    基本信息 书名:21世纪高等学校计算机基础实用规划教材:算法与程序设计基础(Python版) 定价:39.00元 作者:吴萍21世纪高 出版社:清华大学出版社 出版日期:2015_2_1 ISBN:9 ...

  6. 简单算法的举例c语言,计算机科学与技术系C语言程序设计22简单算法举例.PPT

    计算机科学与技术系C语言程序设计22简单算法举例 第2章 程序的灵魂--算法 本章主要介绍算法的思想及算法的表示方法. 2.0 绪论 2.1 算法的概念 2.2 简单算法举例 2.3 算法的特性 2. ...

  7. 计算机网络课程设计之简单 Web Server 程序的设计与实现

    前言 本实验是实现一个简易的webserver,我们一直在访问网站,甚至还做过Web课程设计,部署过Tomcat等等,所以说这次实验能更深入的了解其原理 白嫖容易,创作不易,本文原创,转载请注明!!! ...

  8. 标准差分进化算法matlab程序实现(转载)

    标准差分进化算法matlab程序实现 自适应差分演化算法方面的Matlab和C++代码及论文 差分进化算法 DE-Differential Evolution matlab练习程序(差异演化DE) [ ...

  9. java的简单算法题_[2]十道算法题【Java实现】

    前言 清明不小心就拖了两天没更了-- 这是十道算法题的第二篇了-上一篇回顾:十道简单算法题 最近在回顾以前使用C写过的数据结构和算法的东西,发现自己的算法和数据结构是真的薄弱,现在用Java改写一下, ...

最新文章

  1. 概率x^2 t F三大分布的联系
  2. java 线程包_Java 多线程——工具包
  3. 每天数十亿次请求的应用经验分享,值得参考!
  4. PHP $_FILES中error返回值详解
  5. strace 哇,好多系统调用
  6. 03 - const static extern
  7. uva 12442 . Forwarding Emails
  8. shell高级-----正则表达式
  9. 手机modem开发(5)---LTE基本架构
  10. Golang学习(10)——bufio包
  11. JavaScript中函数式编程的原理
  12. opencv 图像旋转_图像数据集增强方式总结和实现【数字图像处理系列四】
  13. IPv6笔记-地址结构与分类
  14. 【HUSTOJ】1055: 字符图形11-字母正三角
  15. Bypass open_basedir
  16. 小程序错误:Setting data field collected to undefined is invalid.
  17. 关于华硕主板的图像输出设置
  18. Auto.js学习笔记13:images.findImag()报错找不到方法,返回的坐标无法点击等问题利用图片的相似度执行精准目标点击(实战篇)
  19. linux音频子系统 - DAPM
  20. 美国国立卫生研究院(NIH)江晓芳组诚聘生物信息学博士后

热门文章

  1. 盲人可以也做软件工程师,反思一下老哥
  2. 开源是项“全民工程”,揭秘开源团队的管理运作
  3. 为什么我要放弃javaScript数据结构与算法(第二章)—— 数组
  4. 聊聊storm的IWaitStrategy
  5. Python3的urllib.parse常用函数小结
  6. 11WinDlg 对话框一
  7. UPX脱壳全程分析(转)
  8. Discuz!NT控件剖析 之 Button [原创: 附源码]
  9. 用AWStats分析网站日志
  10. NYOJ 5767 装背包