同意1楼的回答,用cftool. 但是不知道函数形式的情况下确实不好拟合。
有几类cftool中没有,但科研也常用的函数拟合你可以试试, 比如pade近似, 广义回归网络, 主成分分解等.
给你一个贝叶斯正则化训练的BP前馈网络试试看
返回值funObj就是拟合出来的方程
%-----------分割线-----------------
function funObj = netFit(x, y)
maxID=1; % 这里取1. 所以每次运行结果都有所不同,取大点结果基本就不变了.
% Matlab手册建议训练很多网络求平均,比如maxID=100. 可并行加速
% 具体参考doc train --> useParallel, useGPU. 自动的.
net = feedforwardnet(15); % 这个值随便取的,其实有讲究...
net.trainFcn = 'trainbr';
net.divideParam.trainRatio = 0.7;
net.divideParam.valRatio = 0.3;
net.divideParam.testRatio = 0;
net = configure(net, x, y);
net.trainParam.showWindow = 0;
h = waitbar(0,'Training with Bayesian Regularization 0%');
netCollect = cell(maxID,1);
for netID=1:maxID
net = init(net);
net = train(net, x, y);
waitbar(netID/maxID,h ,...
sprintf('Training with Bayesian Regularization %4.1f%%',netID/maxID*100));
netCollect{netID} = net;
end
delete(h);
funObj = @(x)evalNet(netCollect, x);
xfit = linspace(min(x), max(x), 100);
yfit = funObj(xfit);
figure(10);plot(xfit, yfit, 'r-', x, y, 'ok');
legend('Fitted Line','Data')
xlabel('X','FontSize',14);ylabel('Y','FontSize',14);title('maxID=100')
end
function y = evalNet(netCollect, x)
NNet = length(netCollect);
y = zeros(size(x));
for netId=1:NNet
net = netCollect{netId};
y = y+net(x);
end
y = y/NNet;
end
用数据拟合工具箱 cftool