如何用matlab画平滑的曲线?

如何用matlab画平滑的曲线?,第1张

方法一:转自yihandk666

x=[0 0.1 0.16 0.27 0.41 0.48 0.59 0.8]

y=[5 9 70 118 100 17 0 5]

那么用plot画出的函数为折线,如下图:

要想把那个折点平滑掉。像论文中那样,具体采用样条函数:下面是样条函数的定义:

spline function 一类分段(片)光滑、并且在各段交接处也有一定光滑性的函数。简称样条。样条一词来源于工程绘图人员为了将一些指定点连接成一条光顺曲线所使用的工具,即 富有d性的细木条或薄钢条。由这样的样条形成的曲线在连接点处具有连续的坡度与曲率。分段低次多项式、在分段处具有一定光滑性的函数插值就是模拟以上原理 发展起来的,它克服了高次多项式插值可能出现的振荡现象,具有较好的数值稳定性和收敛性,由这种插值过程产生的函数就是多项式样条函数。

大概意思就是让转折点变平滑,下面就是采用这种方式:

values = spcrv([[x(1) x x(end)][y(1) y y(end)]],3)

plot(values(1,:),values(2,:))

具体里面的原理我也没看过,不过目的是达到了 下面是结果

方法二:转自greatdju

figure:

x1=[0.8395 0.7995 0.7895 0.7867 0.7857 0.7853 0.7847 ]

y1=[1.11E-01 4.64E-02 1.19E-03 1.77E-04 1.57E-05 3.45E-06 2.55E-07 ]

subplot(1,2,1)

semilogy(x1,y1)  %原来的折线

title('左边:原来的折线')

x2=linspace(min(x1),max(x1))

y2=interp1(x1,y1,x2,'cubic')

subplot(1,2,2)

semilogy(x2,y2)  %处理后的曲线

title('右边:处理后的曲线')

去这里看看!!http://wenku.baidu.com/view/dc4d1c40a8956bec0975e3b2.html

MATLAB中样条函数命令

B样条函数

splst显示生成B样条函数的M文件

spmak生成B样条函数

spcrv生成均匀划分的B样条函数

spapi插值生成B样条函数

spap2用最小二乘法拟合生成B样条函数

spaps对生成的B样条曲线进行光滑处理

spcol生成B样条函数的配置矩阵

三次样条函数

函 数描述

csapi 插值生成三次样条函数

csape 生成给定约束条件下的三次样条函数

csaps 平滑生成三次样条函数

cscvn 生成一条内插参数的三次样条曲线

getcurve 动态生成三次样条曲线

分段多项式样条函

pplst 显示关于生成分段多项式样条曲线的M文件

ppmak 生成分段多项式样条函数

ppual 计算在给定点处的分段多项式样条函数值

有理样条函数

rpmak 生成有理样条函数

rsmak 生成有理样条函数

*** 作样条函数

fnval 计算在给定点处的样条函数值

fmbrk 返回样条函数的某一部分(如断点或系数等)

fncmb 对样条函数进行算术运算

fn2fm 把一种形式的样条函数转化成另一种形式的样条函数

三次B样条曲线的C实现

关键词: C++

三次B样条曲线的C实现

三次B样条曲线是分段参数的多项式曲线结合起来的,亦用分段的形式去表现

建立[CD,PCD]的绘制空间

File→new→Project→MFC AppWizard[exe] →Singer→Finish

然后在classview找到Cmyview→OnDarw[CDC*pDC]双击就ok

在起对应的位置加上以下语句:

void XXXTView::OnDraw(CDC* pDC) //XXX为C文件名

{

XXXTDoc* pDoc = GetDocument()

ASSERT_VALID(pDoc)

// TODO: add draw code for native data here

Static long p[N+3][2]={50,400,100,120,260,180,500,120,600,300,590,420,50,400,100,120,260,180}

int i

pDC->MoveTo(p[0][0],p[0][1])

for(i=1iLineTo(p[i][0],p[i][1])

B3_curves('p',p,N-1,0,0,pDC)

// pDC->SelectObject(oldPen2)

/*

//插值端点条件三次B样条曲线

p[0][0]=6.0*p[0][0]-4.0*p[1][0]-p[2][0]

p[0][1]=6.0*p[0][1]-4.0*p[1][1]-p[2][1]

p[N-1][0]=6.0*p[N-1][0]-4.0*p[N-2][0]-p[N-3][0]

p[N-1][1]=6.0*p[N-1][1]-4.0*p[N-2][1]-p[N-3][1]

CPen newPen(PS_SOLID,1,RGB(0,0,255))

CPen *oldPen=pDC->SelectObject(&newPen)

B3_curves('p',p,N-1,0,0,pDC)

pDC->SelectObject(oldPen)*/

/*

//周期边界条件三次B样条曲线

p[0][0]=50

p[0][1]=400

p[N-1][0]=590

p[N-1][1]=420

CPen newPen1(PS_SOLID,1,RGB(255,0,0))

CPen *oldPen1=pDC->SelectObject(&newPen1)

B3_curves('p',p,N+2,0,0,pDC)

pDC->SelectObject(oldPen1)*/

}

void XXXTView::B3_curves(char pflag,long xq[][2],int m,long lxx,long lyy,CDC*pDC)

{

XXXTDoc* pDoc = GetDocument()

ASSERT_VALID(pDoc)

int i,j,k=10

long lx1,ly1

double t0,t1,t2,t3

lx1=(xq[0][0]+4.0*xq[1][0]+xq[2][0])/6+lxx

ly1=(xq[0][1]+4.0*xq[1][1]+xq[2][1])/6+lyy

if(pflag=='p')pDC->MoveTo(lx1,ly1)

for(i=1i

for(j=0j<=kj++)

{

CPen newPen2(PS_SOLID,i,RGB(80*i,50*i,10*i))

CPen *oldPen2=pDC->SelectObject(&newPen2)

//用不同颜色表现出6个顶点所绘制的三段曲线而构成的B样条曲线

//其中i为颜色的粗度,RGB内数据为颜色设置

t3=1.0*j/k

t0=1-t3

t0=t0*t0*t0/6.0

t1=((3.0*t3-6.0)*t3*t3+4.0)/6.0

t2=(((3-3*t3)*t3+3)*t3+1)/6.0

t3=1.0-t0-t1-t2

lx1=xq[i-1][0]*t0+xq[i][0]*t1+xq[i+1][0]*t2+xq[i+2][0]*t3+lxx

ly1=xq[i-1][1]*t0+xq[i][1]*t1+xq[i+1][1]*t2+xq[i+2][1]*t3+lyy

if(pflag=='p')pDC->LineTo(lx1,ly1)

}

}

又多了一招,在此环境下实现颜色

哦耶…


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12026732.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存