matlab 非线性曲线拟合表达式书写与初值选取

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab 非线性曲线拟合表达式书写与初值选取相关的知识,希望对你有一定的参考价值。

本人先研究采用matlab进行非线性数据拟合,编写的函数如下
[filename,filepath]=uigetfile('*.txt','选择拟合的数据文件');%弹出对话框,然后选择你要处理的文件
file = [filepath filename];
fid = fopen(file,'rt');
if fid == -1
waring('Error opening the file')
end
fclose(fid);
fid=load(file);
x=fid(:,1);%读取第一列数据
y=fid(:,2);%读取第二列数据
myfunc=inline('-beta(1)*max(y)*exp(-pi*(x-beta(2)).^2/beta(3).^2))','beta','x');
beta=nlinfit(x,y,myfunc,[0.3 0.5 10]);
% beta为迭代初值,不能随便选,必须要在目标值附近,否则发散或解不出来
b=beta(1);
s0=beta(2);
r=beta(3);
%test the model
xx=min(x):max(x);
yy=b*max(y)*exp(-pi*(x-s0)^2/r^2);
plot(x,y,'o',xx,yy,'--');
set(handles.edit1,'string',num2str(b),'max',10);
set(handles.edit2,'string',num2str(s0),'max',10);
set(handles.edit3,'string',num2str(r),'max',10);
Error in inline expression ==> beta(1)*max(y)*exp(-pi*(x-beta(2)).^2)./beta(3)^2)),表达式错误,不知怎么修改,望大侠指教 ,希望有高手将表达式书写一下。

匿名函数调用,把inline那一行改为,应该就OK
myfunc=@( beta, x) -beta(1)*max(x).*exp(-pi*(x-beta(2)).^2/beta(3).^2);

2楼基本上已经说到点上了,但是转换成(max(y))也是不可行的。num2str的变量为常数。例如
for n = 1:12
eval(['M' num2str(n) ' = magic(n)'])
end
最好还是写成具体的函数形式。

或者单个函数 function y=f(x)
或者匿名函数 fun=@(x) x.^2
参考技术A beat/beta?还有公式里*和.*用的对吗? 参考技术B 我大概看了一下,inline里的字符串中要是有'隐'数字时,用num2str转一下,比如你写'max(y)',它只把这当成六个字符,你要想让电脑知道是几的话就num2str(max(y)),不知道对不对,你再看看 参考技术C 建议您不用inline,而是直接在这个文件中编一个子函数,myfunc

以上是关于matlab 非线性曲线拟合表达式书写与初值选取的主要内容,如果未能解决你的问题,请参考以下文章

matlab中如何拟合光滑曲线

非线性曲线的matlab拟合?

matlab求非线性拟合

matlab拟合曲线的方法有几种

MATLAB实例:非线性曲线拟合

matlab非线性拟合问题