如何用matlab拟合模型分段函数相关内容,小编在这里做了整理,希望能对大家有所帮助,关于如何用matlab拟合模型分段函数信息,一起来了解一下吧!
本文目录一览:

如何用matlab拟合模型分段函数
你要知道,你要拟合的是一个分段函数,这本身就不是一般的连续光滑函数。
nlinfit之所以要有初值这一项,就是考虑到在某些变态的情况下,无法找到最小二乘函数的最小值,可能是一个局部的最小值,也可能根本找不到,所以有必要通过改变迭代初值的方法进行试验。对于这种分段函数,最好的方法还是分段拟合。
fun1=inline('4.213-300*x/ref(1)-300*(ref(2)+ref(3))+300*ref(3)*exp(-x/(ref(3)*ref(4)))','ref','x');
fun2=inline('4.213-3000/ref(1)-300*ref(3)*exp(-x/(ref(3)*ref(4)))*(exp(10/(ref(3)*ref(4)))-1)','ref','x');
fun=@(ref,t)((t<=10).*fun1(ref,t)+(t>10).*fun2(ref,t));
t=0:0.1:50;
v=[3.969
3.963
3.959
3.955
3.952
3.949
3.947
3.945
3.943
3.941
3.939
3.938
3.936
3.935
3.933
3.932
3.93
3.929
3.928
3.927
3.926
3.925
3.923
3.922
3.921
3.92
3.919
3.918
3.917
3.916
3.915
3.914
3.913
3.912
3.911
3.91
3.909
3.908
3.907
3.907
3.906
3.905
3.904
3.903
3.903
3.902
3.901
3.9
3.9
3.899
3.898
3.898
3.897
3.896
3.896
3.895
3.894
3.893
3.893
3.892
3.891
3.891
3.89
3.889
3.889
3.888
3.888
3.887
3.887
3.886
3.886
3.885
3.884
3.884
3.883
3.882
3.882
3.881
3.88
3.88
3.879
3.879
3.878
3.878
3.877
3.877
3.876
3.876
3.875
3.875
3.874
3.874
3.873
3.873
3.872
3.872
3.871
3.87
3.87
3.869
3.869
4.105
4.108
4.11
4.112
4.114
4.115
4.116
4.117
4.118
4.119
4.119
4.12
4.12
4.121
4.122
4.122
4.123
4.123
4.124
4.124
4.124
4.125
4.125
4.126
4.126
4.126
4.127
4.127
4.128
4.128
4.129
4.129
4.129
4.129
4.129
4.13
4.13
4.13
4.13
4.13
4.131
4.131
4.131
4.131
4.132
4.132
4.132
4.132
4.132
4.132
4.133
4.133
4.133
4.133
4.133
4.134
4.134
4.134
4.134
4.134
4.134
4.135
4.135
4.135
4.135
4.135
4.136
4.136
4.136
4.136
4.136
4.137
4.137
4.138
4.138
4.138
4.139
4.139
4.139
4.139
4.139
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.14
4.141
4.141
4.141
4.141
4.141
4.141
4.141
4.141
4.141
4.141
4.142
4.142
4.142
4.142
4.142
4.142
4.142
4.142
4.142
4.142
4.143
4.143
4.143
4.143
4.143
4.143
4.143
4.143
4.143
4.143
4.143
4.143
4.143
4.144
4.144
4.144
4.144
4.144
4.144
4.144
4.144
4.144
4.144
4.144
4.145
4.145
4.145
4.145
4.145
4.145
4.145
4.145
4.145
4.145
4.145
4.145
4.145
4.145
4.145
4.145
4.146
4.146
4.146
4.146
4.146
4.146
4.146
4.146
4.146
4.146
4.146
4.146
4.146
4.147
4.147
4.147
4.147
4.147
4.147
4.147
4.147
4.147
4.147
4.147
4.147
4.147
4.147
4.147
4.148
4.148
4.148
4.148
4.148
4.148
4.148
4.148
4.148
4.148
4.148
4.148
4.148
4.148
4.148
4.148
4.148
4.149
4.149
4.149
4.149
4.149
4.149
4.149
4.149
4.149
4.149
4.149
4.149
4.149
4.149
4.149
4.149
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.15
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.151
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.152
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.153
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.154
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.155
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156
4.156];
abc=nlinfit(t',v,fun,[51891 0.00083 0.00013 12050]');
plot(t,v);hold on;
f=@(t)(fun(abc,t));
fplot(f,[0,50],'r')

ASP.NET 或 PHP 图象高手来
1、首先不知道你所谓的卡通是什么样子的?
2、经过PS后(你提到了卡通效果)应该在饱和度、某点的颜色值都发生了变化,当然色深度也有可能变了。
提供一个思路:将两张图片在内存中都转化为,相同色深的位图,然后灰度处理,再然后利用边缘检测法判断边缘(这里是有局限性的,需要背景比较明显,如果背景也是图像效果不好,此法的代码在网上应该可以找到)。然后记录边缘的矩阵值,把两个做比较,设置允许差错范围(比如100边缘数据里有90个以上的值一致就认为是同一张图)
当然,在处理速度上你自己再看看二次样条、傅利叶、插值等算法吧…
哥们,你这个项目不是个小项目呀!如果真是个本科生的毕设,那个学校的老师也太牛了!如果有这个学校,我希望到那里上研!强……
补充:轮廓提取算法
/*************************************************************************
*
* 函数名称:
* ContourDIB()
*
* 参数:
* LPSTR lpDIBBits - 指向源DIB图像指针
* LONG lWidth - 源图像宽度(象素数,必须是4的倍数)
* LONG lHeight - 源图像高度(象素数)
* 返回值:
* BOOL - 运算成功返回TRUE,否则返回FALSE。
*
* 说明:
* 该函数用于对图像进行轮廓提取运算。
*
* 要求目标图像为只有0和255两个灰度值的灰度图像。
************************************************************************/
BOOL WINAPI ContourDIB(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)
{
// 指向源图像的指针
LPSTR lpSrc;
// 指向缓存图像的指针
LPSTR lpDst;
// 指向缓存DIB图像的指针
LPSTR lpNewDIBBits;
HLOCAL hNewDIBBits;
//循环变量
long i;
long j;
unsigned char n,e,s,w,ne,se,nw,sw;
//像素值
unsigned char pixel;
// 暂时分配内存,以保存新图像
hNewDIBBits = LocalAlloc(LHND, lWidth * lHeight);
if (hNewDIBBits == NULL)
{
// 分配内存失败
return FALSE;
}
// 锁定内存
lpNewDIBBits = (char * )LocalLock(hNewDIBBits);
// 初始化新分配的内存,设定初始值为255
lpDst = (char *)lpNewDIBBits;
memset(lpDst, (BYTE)255, lWidth * lHeight);
for(j = 1; j <lHeight-1; j++)
{
for(i = 1;i <lWidth-1; i++)
{
// 指向源图像倒数第j行,第i个象素的指针
lpSrc = (char *)lpDIBBits + lWidth * j + i;
// 指向目标图像倒数第j行,第i个象素的指针
lpDst = (char *)lpNewDIBBits + lWidth * j + i;
注意要转换为unsigned char型
pixel = (unsigned char)*lpS
//取得当前指针处的像素值,rc;
//目标图像中含有0和255外的其它灰度值
// if(pixel != 255 && pixel != 0)
// return FALSE;
if(pixel == 0)
{
*lpDst = (unsigned char)0;
nw = (unsigned char)*(lpSrc + lWidth -1);
n = (unsigned char)*(lpSrc + lWidth );
ne = (unsigned char)*(lpSrc + lWidth +1);
w = (unsigned char)*(lpSrc -1);
e = (unsigned char)*(lpSrc +1);
sw = (unsigned char)*(lpSrc - lWidth -1);
s = (unsigned char)*(lpSrc - lWidth );
se = (unsigned char)*(lpSrc - lWidth +1);
//如果相邻的八个点都是黑点
if(nw+n+ne+w+e+sw+s+se==0)
{
*lpDst = (unsigned char)255;
}
}
}
}
// 复制腐蚀后的图像
memcpy(lpDIBBits, lpNewDIBBits, lWidth * lHeight);
// 释放内存
LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits);
// 返回
return TRUE;
}
/*************************************************************************
*
* 函数名称:
* TraceDIB()
*
* 参数:
* LPSTR lpDIBBits - 指向源DIB图像指针
* LONG lWidth - 源图像宽度(象素数,必须是4的倍数)
* LONG lHeight - 源图像高度(象素数)
* 返回值:
* BOOL - 运算成功返回TRUE,否则返回FALSE。
*
* 说明:
* 该函数用于对图像进行轮廓跟踪运算。
*
* 要求目标图像为只有0和255两个灰度值的灰度图像。
************************************************************************/
BOOL WINAPI TraceDIB(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)
{
// 指向源图像的指针
LPSTR lpSrc;
// 指向缓存图像的指针
LPSTR lpDst;
// 指向缓存DIB图像的指针
LPSTR lpNewDIBBits;
HLOCAL hNewDIBBits;
// 图像每行的字节数
LONG lLineBytes;
//循环变量
long i;
long j;
//像素值
unsigned char pixel;
//是否找到起始点及回到起始点
bool bFindStartPoint;
//是否扫描到一个边界点
bool bFindPoint;
//起始边界点与当前边界点
Point StartPoint,CurrentPoint;
//八个方向和起始扫描方向
int Direction[8][2]={{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0}};
int BeginDirect;
// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8);
// 暂时分配内存,以保存新图像
hNewDIBBits = LocalAlloc(LHND, lLineBytes * lHeight);
if (hNewDIBBits == NULL)
{
// 分配内存失败
return FALSE;
}
// 锁定内存
lpNewDIBBits = (char * )LocalLock(hNewDIBBits);
// 初始化新分配的内存,设定初始值为255
lpDst = (char *)lpNewDIBBits;
memset(lpDst, (BYTE)255, lLineBytes * lHeight);
//先找到最左上方的边界点
bFindStartPoint = false;
for (j = 0;j < lHeight && !bFindStartPoint;j++)
{
for(i = 0;i < lWidth && !bFindStartPoint;i++)
{
// 指向源图像倒数第j行,第i个象素的指针
lpSrc = (char *)lpDIBBits + lLineBytes * j + i;
//取得当前指针处的像素值,注意要转换为unsigned char型
pixel = (unsigned char)*lpSrc;
if(pixel == 0)
{
bFindStartPoint = true;
StartPoint.Height = j;
StartPoint.Width = i;
// 指向目标图像倒数第j行,第i个象素的指针
lpDst = (char *)lpNewDIBBits + lLineBytes * j + i;
*lpDst = (unsigned char)0;
}
}
}
//由于起始点是在左下方,故起始扫描沿左上方向
BeginDirect = 0;
//跟踪边界
bFindStartPoint = false;
//从初始点开始扫描
CurrentPoint.Height = StartPoint.Height;
CurrentPoint.Width = StartPoint.Width;
while(!bFindStartPoint)
{
bFindPoint = false;
while(!bFindPoint)
{
//沿扫描方向查看一个像素
lpSrc = (char *)lpDIBBits + lLineBytes * ( CurrentPoint.Height + Direction[BeginDirect][1])
+ (CurrentPoint.Width + Direction[BeginDirect][0]);
pixel = (unsigned char)*lpSrc;
if(pixel == 0)
{
bFindPoint = true;
CurrentPoint.Height = CurrentPoint.Height + Direction[BeginDirect][1];
CurrentPoint.Width = CurrentPoint.Width + Direction[BeginDirect][0];
if(CurrentPoint.Height == StartPoint.Height && CurrentPoint.Width == StartPoint.Width)
{
bFindStartPoint = true;
}
lpDst = (char *)lpNewDIBBits + lLineBytes * CurrentPoint.Height + CurrentPoint.Width;
*lpDst = (unsigned char)0;
//扫描的方向逆时针旋转两格
BeginDirect--;
if(BeginDirect == -1)
BeginDirect = 7;
BeginDirect--;
if(BeginDirect == -1)
BeginDirect = 7;
}
else
{
//扫描方向顺时针旋转一格
BeginDirect++;
if(BeginDirect == 8)
BeginDirect = 0;
}
}
}
// 复制腐蚀后的图像
memcpy(lpDIBBits, lpNewDIBBits, lWidth * lHeight);
// 释放内存
LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits);
// 返回
return TRUE;
}

怎么用matlab进行非线性的多元函数拟合?
我爱编程网(https://www.52biancheng.com)小编还为大家带来怎么用matlab进行非线性的多元函数拟合?的相关内容。
方法一:
我爱编程网
1、最常用的是多项式拟合,采用polyfit函数,在命令窗口输入自变量x和因变量y。
2、以二次多项式拟合为例,输入p=polyfit(x,y,2),如果想拟合更高次的多项式,更换括号内数字即可。
通过计算获得的p,是一个数组,对应了多项式的各项系数,以图中为例,拟合出的多项式为:y=0.9962x2+0.0053x-0.2833。
方法二:
1、首先,在上方工具栏选取APPS,点击curvefitting。输入自变量x和因变量y。
2、选择拟合方式,有多项式拟合polynomial,高斯拟合gaussian,幂指数拟合power等等,本次以多项式拟合为例。
3、通过数据计算,可以获得曲线参数(曲线函数中的各项系数),从而实现曲线拟合。
以上就是如何用matlab拟合模型分段函数全部内容了,了解更多相关信息,关注我爱编程网。更多相关文章关注我爱编程网:
www.52biancheng.com免责声明:文章内容来自网络,如有侵权请及时联系删除。