如何用matlab将离散数据拟合成方程,在线等!!!

2024-11-07 20:41:23
有3个网友回答
网友(1):

同意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


网友(2):

用数据拟合工具箱 cftool

网友(3):