05插值和拟合

1.一维插值

(1) 机床加工零件,试用分段线性和三次样条两种插值方法计算。并求x=0处的曲线斜率和13<=x<=15范围内y的最小值。

  1. x0=[0 3 5 7 9 11 12 13 14 15];
  2. y0=[0 1.2 1.7 2 2.1 2.0 1.8 1.2 1.0 1.6];
  3. x=0:0.1:15;
  4. % interp1现有插值函数,要求x0单调,'method'
  5. % nearest 最近项插值 linear 线性插值
  6. % spline 立方样条插值 cubic 立方插值
  7. y1=interp1(x0,y0,x);
  8.  
  9. y2=interp1(x0,y0,x,'spline');
  10.  
  11. pp1=csape(x0,y0);
  12. y3=fnval(pp1,x);
  13.  
  14. pp2=csape(x0,y0,'second');
  15. y4=fnval(pp2,x);
  16.  
  17. [x',y1',y2',y3',y4']
  18.  
  19. subplot(1,4,1)
  20. plot(x0,y0,'+',x,y1)
  21. title('Piecewise linear 分段线性')
  22.  
  23. subplot(1,4,2)
  24. plot(x0,y0,'+',x,y2)
  25. title('spline1')
  26.  
  27. subplot(1,4,3)
  28. plot(x0,y0,'+',x,y3)
  29. title('spline2')
  30.  
  31. subplot(1,4,4)
  32. plot(x0,y0,'+',x,y4)
  33. title('second')
  34.  
  35. dx=diff(x);
  36. dy=diff(y3);
  37. dy_dx=dy./dx;
  38. dy_dx0=dy_dx(1);
  39. ytemp=y3(131:151);
  40. ymin=min(ytemp);
  41. index=find(y3==ymin);
  42. xmin=x(index);
  43. [xmin,ymin]

(2)  已知速度的四个观测值,用三次样条求位移S=0.15到0.18上的vd(t)积分

t   0.15    0.16     0.17    0.18
vt   3.5    1.5       2.5       2.8

  1. format compact;
  2. % 已知速度的四个观测值,用三次样条求位移S=0.150.18上的vd(t)积分
  3. % t 0.15 0.16 0.17 0.18
  4. % vt 3.5 1.5 2.5 2.8
  5. clc,clear
  6. x0=0.15:0.01:0.18;
  7. y0=[3.5 1.5 2.5 2.8];
  8. % csape 三次样条插值,返回要求插值的的函数值
  9. pp=csape(x0,y0) % 默认的边界条件,Lagrange边界条件
  10. format long g
  11. xishu = pp.coefs % 显示每个区间上三次多项式的系数
  12. s=quadl(@(t)ppval(pp,t),0.15,0.18) % 求积分
  13. format % 恢复短小数的显示格式
  14.  
  15. % 画图
  16. t=0.15:0.001:0.18;
  17. y=fnval(pp,t);
  18. plot(x0,y0,'+',t,y)

  1. pp =
  2. 包含以下字段的 struct:
  3.  
  4. form: 'pp'
  5. breaks: [0.1500 0.1600 0.1700 0.1800]
  6. coefs: [3×4 double]
  7. pieces: 3
  8. order: 4
  9. dim: 1
  10. xishu =
  11. 1 2
  12. -616666.666666667 33500
  13. -616666.666666667 15000
  14. -616666.666666668 -3499.99999999999
  15. 3 4
  16. -473.333333333334 3.5
  17. 11.6666666666671 1.5
  18. 126.666666666667 2.5
  19. s =
  20. 0.068625

2.二维插值

(1) 丘陵测量高度。试插值一曲面,确定合适的模型,并由此找出最高的和该点的最高程。

  1. format compact;
  2. % 丘陵,在x,y方向上每隔100m测个点
  3. clear,clc
  4. x=100:100:500;
  5. y=100:100:400;
  6. z=[636 697 624 478 450
  7. 698 712 630 478 420
  8. 680 674 598 412 400
  9. 662 626 552 334 310];
  10.  
  11. pp=csape({x,y},z') % 三次样条,返回函数
  12. xi=100:10:500;
  13. yi=100:10:400;
  14. cz=fnval(pp,{xi,yi}); % 得到插值后的z
  15.  
  16. [i,j]=find(cz==max(max(cz))) % 找最高点的地址
  17. xm=xi(i),ym=yi(i),zmax=cz(i,j) % 求最高点的坐标
  18.  
  19. % 画图
  20. [X,Y]=meshgrid(yi,xi);%构造1×1网格,20×20个
  21. [X0,Y0]=meshgrid(y,x);%构造1×1网格,20×20个
  22. plot3(X0,Y0,z,'p', 'MarkerEdgeColor','k','MarkerSize',15 ,'MarkerFaceColor',[.49 1 .63])
  23. hold on
  24. % mesh(X,Y,cz)
  25. surf(X,Y,cz)
  1. pp =
  2. 包含以下字段的 struct:
  3.  
  4. form: 'pp'
  5. breaks: {[100 200 300 400 500] [100 200 300 400]}
  6. coefs: [1×16×12 double]
  7. pieces: [4 3]
  8. order: [4 4]
  9. dim: 1
  10. i =
  11. 8
  12. j =
  13. 9
  14. xm =
  15. 170
  16. ym =
  17. 170
  18. zmax =
  19. 720.6252

(2) 海底水深

  1. format compact;
  2. % 二维海底水深数据
  3. clc,clear;
  4. x=[129,140,103.5,88,185.5,195,105,157.5,107.5,77,81,162,162,117.5];
  5. y=[7.5,141.5,23,147,22.5,137.5,85.5,-6.5,-81,3,56.5,-66.5,84,-33.5];
  6. z=-[4,8,6,8,6,8,8,9,9,8,8,9,4,9]
  7. xmm=minmax(x); % x的最大值和最小值
  8. ymm=minmax(y); % y的最大值和最小值
  9. xi=xmm(1):xmm(2);
  10. yi=ymm(1):ymm(2);
  11. zi1=griddata(x,y,z,xi,yi','cubic'); % 立方插值
  12. zi2=griddata(x,y,z,xi,yi','nearest'); % 最近点插值
  13. zi=zi1 %立方插值和最近点插值的混合插值的初始值
  14. zi(isnan(zi1)) = zi2(isnan(zi1)); % 把立方插值中的不确定值缓存最近点插值的结果
  15. subplot(1,2,1),plot(x,y,'*');
  16. subplot(1,2,2),mesh(xi,yi,zi);

3.拟合

(1) 最小二乘拟合

  1. x=[19 25 31 38 44]';
  2. y=[19.0 32.3 49.0 73.3 97.8]';
  3. r=[ones(5,1),x.^2]
  4. ab=r\y
  5. x0=19:0.1:44;
  6. y0=ab(1)+ab(2)*x0.^2;
  7. plot(x,y,'o',x0,y0,'r')
  8. % y = 0.9726 + 0.0500*x^2

(2) 多项式拟合

  1. x0=[1990 1991 1992 1993 1994 1995 1996];
  2. y0=[70 122 144 152 174 196 202];
  3. plot(x0,y0,'*')
  4. a=polyfit(x0,y0,1)
  5. y97=polyval(a,1997) % 拟合的多项式在1997处的值
  6. y98=polyval(a,1998)

(3) 最小二乘优化lsqlin函数

  1. x=[19 25 31 38 44]';
  2. y=[19.0 32.3 49.0 73.3 97.8]';
  3. r=[ones(5,1),x.^2];
  4. ab=lsqlin(r,y)
  5. x0=19:0.1:44;
  6. y0=ab(1)+ab(2)*x0.^2;
  7. plot(x,y,'o',x0,y0,'r')

(4) 最小二乘优化lsqcurvefit函数,拟合函数中的参数

fun1.m

  1. function f=fun1(canshu,xdata);
  2. f= exp(-canshu(1)*xdata(:,1)).*sin(canshu(2)*xdata(:,2))+xdata(:,3).^2; %其中canshu(1)=k1canshu(2)=k2,注意函数中自变量的形式

data1.txt

  1. 1 15.02 23.73 5.49 1.21 14 15.94 23.52 5.18 1.98
  2. 2 12.62 22.34 4.32 1.35 15 14.33 21.86 4.86 1.59
  3. 3 14.86 28.84 5.04 1.92 16 15.11 28.95 5.18 1.37
  4. 4 13.98 27.67 4.72 1.49 17 13.81 24.53 4.88 1.39
  5. 5 15.91 20.83 5.35 1.56 18 15.58 27.65 5.02 1.66
  6. 6 12.47 22.27 4.27 1.50 19 15.85 27.29 5.55 1.70
  7. 7 15.80 27.57 5.25 1.85 20 15.28 29.07 5.26 1.82
  8. 8 14.32 28.01 4.62 1.51 21 16.40 32.47 5.18 1.75
  9. 9 13.76 24.79 4.42 1.46 22 15.02 29.65 5.08 1.70
  10. 10 15.18 28.96 5.30 1.66 23 15.73 22.11 4.90 1.81
  11. 11 14.20 25.77 4.87 1.64 24 14.75 22.43 4.65 1.82
  12. 12 17.07 23.17 5.80 1.90 25 14.35 20.04 5.08 1.53
  13. 13 15.40 28.57 5.22 1.66

主函数

  1. % 拟合函数y=e^(-k1*x1)*sin(k2*x2)+x3*3中的参数k1,k2
  2. clc, clear
  3. a=textread('data1.txt');
  4. y0=a(:,[2,7]); %提出因变量y的数据
  5. y0=nonzeros(y0); %去掉最后的零元素,且变成列向量
  6. x0=[a(:,[3:5]);a([1:end-1],[8:10])]; %由分块矩阵构造因变量数据的2列矩阵
  7. canshu0=rand(2,1); %拟合参数的初始值是任意取的
  8. %非线性拟合的答案是不唯一的,下面给出拟合参数的上下界,
  9. lb=zeros(2,1); %这里是随意给的拟合参数的下界,无下界时,默认值是空矩阵[]
  10. ub=[20;2]; %这里是随意给的上界,无上界时,默认值是空矩阵[]
  11. canshu=lsqcurvefit(@fun1,canshu0,x0,y0,lb,ub)
  1. Local minimum possible.
  2.  
  3. lsqcurvefit stopped because the final change in the sum of squares relative to
  4. its initial value is less than the default value of the function tolerance.
  5.  
  6. <stopping criteria details>
  7.  
  8. canshu =
  9.  
  10. 0.0000
  11. 1.5483

matlab学习——05插值和拟合(一维二维插值,拟合)的更多相关文章

  1. MATLAB二维插值和三维插值

    插值问题描述:已知一个函数上的若干点,但函数具体表达式未知,现在要利用已知的若干点求在其他点处的函数值,这个过程就是插值的过程. 1.一维插值 一维插值就是给出y=f(x)上的点(x1,y1),(x2 ...

  2. 图像的降采样与升采样(二维插值)----转自LOFTER-gengjiwen

    图像的降采样与升采样(二维插值) 1.先说说这两个词的概念: 降采样,即是采样点数减少.对于一幅N*M的图像来说,如果降采样系数为k,则即是在原图中 每行每列每隔k个点取一个点组成一幅图像.降采样很容 ...

  3. 稳定排序nlogn之归并排序_一维,二维

    稳定排序nlogn之归并排序_一维,二维 稳定排序:排序时间稳定的排序 稳定排序包括:归并排序(nlogn),基数排序[设待排序列为n个记录,d个关键码,关键码的取值范围为radix,则进行链式基数排 ...

  4. 一维二维Sparse Table

    写在前面: 记录了个人的学习过程,同时方便复习 Sparse Table 有些情况,需要反复读取某个指定范围内的值而不需要修改 逐个判断区间内的每个值显然太浪费时间 我们希望用空间换取时间 ST表就是 ...

  5. 基于ZXing.Net生成一维二维码

    新阁教育-喜科堂付工原创 最近很多小伙伴对一维码.二维码比较感兴趣,今天主要给大家分享一个C#生成条形码和二维码的案例. C#作为一个高级语言,特点就是快! 我们使用的是开源库ZXing,ZXing是 ...

  6. matlab学习——05插值和拟合(黄河小浪底调水调沙问题)

    05插值和拟合 黄河小浪底调水调沙问题 data3.txt 1800 1900 2100 2200 2300 2400 2500 2600 2650 2700 2720 2650 32 60 75 8 ...

  7. matlab二维插值--interp2与griddata

    二者均是常用的二维插值方法,两者的区别是, interp2的插值数据必须是矩形域(X,Y必须分别是单调向量),即已知数据点(x,y)组成规则的矩阵,或称之为栅格,可使用meshgid生成. gridd ...

  8. java 数组基础学习(一维二维数组)

    1.一维数组 1>静态初始化:数据类型[ ] 变量名 = {元素} 例:int[ ] arr = {1,2} 动态初始化:数据类型[ ] 变量名 = new数据类型[数据长度] 例:int[ ] ...

  9. c++ 依据输入动态声明数组(一维,二维)

    较早的编译器是不同意这样做的,所以一些书籍比方以Tc解说的书本都说数组的下标不能是变量.在vc6.0下亦是如此. 只是在一些较新的编译器如dev c++已经支持了,例如以下代码不会报错 #includ ...

随机推荐

  1. queue模块笔记

    queue被称为消息队列,数据不会混乱,也可以用于复杂业务传递元素,队列是多线程的利器,其内部有锁的机制可以控制数据的统一且安全 queue.Queue()按照先进先出原则 queue.LifoQue ...

  2. 关于WAMP的apache 人多了就访问非常卡的问题解决方法

    一直用WAMP 但人多了(在线人数上了500) 就卡得不得了 而这时服务器负载却很小 CPU15% 内存25% 整了好久都没个结果 偶然看到一篇教程 原来是连接数限制的问题 改了就速度飞快了 打开ap ...

  3. matlab(6) Regularized logistic regression : plot data(画样本图)

    Regularized logistic regression :  plot data(画样本图) ex2data2.txt 0.051267,0.69956,1-0.092742,0.68494, ...

  4. 微信H5支付时用户有微信分身停留5秒后未选择哪个微信分身,也未支付就被动回调到商户支付是否完成的页面

    微信H5支付时用户有微信分身停留5秒后未选择哪个微信分身,也未支付就被动回调到商户支付是否完成的页面 微信支付中间页调起微信收银台后超过5秒 安卓H5支付设置了redirect_url后调起微信收银台 ...

  5. 7月新的开始 - Axure学习04 - 发布与预览、菜单和表格元件、流程图和连接点、标记元件

    Axure 的发布与预览 1.发布 2.生成html文件 常规:指定浏览器.工具栏的生成 页面.页面说明.元件说明.交互.标志(logo和描述).字体.移动设备等 3.发布到Axshare Axure ...

  6. C++重温历史

    这是一篇C#开发重新学习C++的体验文章. 作为一个C#开发为什么要重新学习C++呢?因为在C#在很多业务场景需要调用一些C++编写的COM组件,如果不了解C++,那么,很容易注定是要被C++同事忽悠 ...

  7. DOM设置css样式

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  8. HTML 文字垂直剧中

    HTML 有个使文字垂直剧中的代码   line-height:     line-height:使用时  总高多少 后边就输入多少PX 剧中前展示 剧中后展示

  9. Ubuntu18.04开机动画(bootsplash)安装

    一.搜索喜欢的主题 1.通过软件源搜索,这个比较简单但是没有太喜欢的.-----------------------------------------------------------pipci@ ...

  10. K Simple question (第十届山东理工大学ACM网络编程擂台赛 正式赛)

    题解:素数筛+唯一分解定理 可以把素数筛那部分放到while之外,减小时间复杂度. #include <stdio.h> #include <stdlib.h> #includ ...