失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Matlab--二次多项式曲面拟合

Matlab--二次多项式曲面拟合

时间:2019-07-28 13:21:19

相关推荐

Matlab--二次多项式曲面拟合

二次多项式曲面公式

总共有6个系数。

绘制曲面图形时,一般给定x和y的取值(一维数组),然后对x和y网格化成二维数组X和Y,将X和Y代入公式,即可得到曲面的数值,最后用surf函数显示。

实例
给定一个二次多项式模型,然后成图

x = 0.1 : 0.1 : 5;y = 0.1 : 0.1 : 5;[X, Y] = meshgrid(x, y);Z = X.^2 + Y.^2 + X.*Y + X + Y + 1;surf(x, y, Z);colormap hotshading interp

添加噪声,随机选择 100 个点用于拟合

rng('default');Zn = awgn(Z, 30, 'measured');xfit = randi(50, 100, 1) / 10;yfit = randi(50, 100, 1) / 10;zfit = zeros(100, 1);for i = 1 : 100zfit(i) = Zn(xfit(i) * 10, yfit(i) * 10);endsurf(x, y, Zfit);colormap hotshading interpscatter3(xfit, yfit, zfit, 50, 'MarkerFaceColor', [0 0 0]);

用lsqcurvefit函数拟合:拟合结果精度高

func = @(var,x) var(1)*x(:,1).^2 + var(2)*x(:,2).^2 + var(3)*x(:,1).*x(:,2) + var(4)*x(:,1) + var(5)*x(:,2) + var(6);a = lsqcurvefit(func,ones(1, 6),[xfit, yfit],zfit);Zfit = a(1) * X.^2 + a(2) * Y.^2 + a(3) * X.*Y + a(4) * X + a(5) * Y + a(6);ya = func(a,[xfit, yfit]);surf(x, y, Zfit);colormap hotshading interphold onsurf(x, y, Zfit);shading interpscatter3(xfit, yfit, ya, 50, 'MarkerFaceColor', [0 0 1]);hold off

完整程序

clear;clc;x = 0.1 : 0.1 : 5;y = 0.1 : 0.1 : 5;[X, Y] = meshgrid(x, y);Z = X.^2 + Y.^2 + X.*Y + X + Y + 1;rng('default');Zn = awgn(Z, 30, 'measured');xfit = randi(50, 100, 1) / 10;yfit = randi(50, 100, 1) / 10;zfit = zeros(100, 1);for i = 1 : 100zfit(i) = Zn(xfit(i) * 10, yfit(i) * 10);endfunc = @(var,x) var(1)*x(:,1).^2 + var(2)*x(:,2).^2 + var(3)*x(:,1).*x(:,2) + var(4)*x(:,1) + var(5)*x(:,2) + var(6);a = lsqcurvefit(func,ones(1, 6),[xfit, yfit],zfit);Zfit = a(1) * X.^2 + a(2) * Y.^2 + a(3) * X.*Y + a(4) * X + a(5) * Y + a(6);ya = func(a,[xfit, yfit]);surf(x, y, Zn);shading interpfreezeColorshold onsurf(x, y, Zfit);colormap hotshading interpscatter3(xfit, yfit, zfit, 50, 'MarkerFaceColor', [0 0 0]);scatter3(xfit, yfit, ya, 50, 'MarkerFaceColor', [0 0 1]);surf(x, y, Z - Zfit);shading interphold offlegend('Model','Fits','Fit','fit','Error');

使用cftool工具拟合附录:freezeColors函数可从/matlabcentral/fileexchange/7943-freezecolors-unfreezecolors下载

function freezeColors(varargin)% freezeColors Lock colors of plot, enabling multiple colormaps per figure. (v2.3)%% Problem: There is only one colormap per figure. This function provides% an easy solution when plots using different colomaps are desired % in the same figure.%% freezeColors freezes the colors of graphics objects in the current axis so % that subsequent changes to the colormap (or caxis) will not change the% colors of these objects. freezeColors works on any graphics object % with CData in indexed-color mode: surfaces, images, scattergroups, % bargroups, patches, etc. It works by converting CData to true-color rgb% based on the colormap active at the time freezeColors is called.%% The original indexed color data is saved, and can be restored using% unfreezeColors, making the plot once again subject to the colormap and% caxis.%%% Usage:% freezeColors applies to all objects in current axis (gca),% freezeColors(axh) same, but works on axis axh.%% Example:% subplot(2,1,1); imagesc(X); colormap hot; freezeColors% subplot(2,1,2); imagesc(Y); colormap hsv; freezeColors etc...%% Note: colorbars must also be frozen. Due to Matlab 'improvements' this can%no longer be done with freezeColors. Instead, please%use the function CBFREEZE by Carlos Adrian Vargas Aguilera%that can be downloaded from the MATLAB File Exchange%(/matlabcentral/fileexchange/24371)%% h=colorbar; cbfreeze(h), or simply cbfreeze(colorbar)%% For additional examples, see test/test_main.m%% Side effect on render mode: freezeColors does not work with the painters% renderer, because Matlab doesn't support rgb color data in% painters mode. If the current renderer is painters, freezeColors% changes it to zbuffer. This may have unexpected effects on other aspects%of your plots.%% See also unfreezeColors, freezeColors_pub.html, cbfreeze.%%% John Iversen (iversen@nsi.edu) 3/23/05%% Changes:% JRI (iversen@nsi.edu) 4/19/06 Correctly handles scaled integer cdata% JRI 9/1/06 should now handle all objects with cdata: images, surfaces, %scatterplots. (v 2.1)% JRI 11/11/06 Preserves NaN colors. Hidden option (v 2.2, not uploaded)% JRI 3/17/07 Preserve caxis after freezing--maintains colorbar scale (v 2.3)% JRI 4/12/07 Check for painters mode as Matlab doesn't support rgb in it.% JRI 4/9/08 Fix preserving caxis for objects within hggroups (e.g. contourf)% JRI 4/7/10 Change documentation for colorbars % Hidden option for NaN colors:% Missing data are often represented by NaN in the indexed color% data, which renders transparently. This transparency will be preserved% when freezing colors. If instead you wish such gaps to be filled with % a real color, add 'nancolor',[r g b] to the end of the arguments. E.g. % freezeColors('nancolor',[r g b]) or freezeColors(axh,'nancolor',[r g b]),% where [r g b] is a color vector. This works on images & pcolor, but not on% surfaces.% Thanks to Fabiano Busdraghi and Jody Klymak for the suggestions. Bugfixes % attributed in the code. % Free for all uses, but please retain the following:% Original Author:% John Iversen, -10% john_iversen@post.harvard.edu appdatacode = 'JRI__freezeColorsData'; [h, nancolor] = checkArgs(varargin); %gather all children with scaled or indexed CDatacdatah = getCDataHandles(h); %current colormapcmap = colormap;nColors = size(cmap,1);cax = caxis; % convert object color indexes into colormap to true-color data using % current colormapfor hh = cdatah', g = get(hh); %preserve parent axis clim parentAx = getParentAxes(hh); originalClim = get(parentAx, 'clim'); % Note: Special handling of patches: For some reason, setting % cdata on patches created by bar() yields an error, % so instead we'll set facevertexcdata instead for patches. if ~strcmp(g.Type,'patch'),cdata = g.CData; elsecdata = g.FaceVertexCData;end %get cdata mapping (most objects (except scattergroup) have it) if isfield(g,'CDataMapping'),scalemode = g.CDataMapping; elsescalemode = 'scaled'; end %save original indexed data for use with unfreezeColorssiz = size(cdata);setappdata(hh, appdatacode, {cdata scalemode}); %convert cdata to indexes into colormap if strcmp(scalemode,'scaled'),%4/19/06 JRI, Accommodate scaled display of integer cdata:% in MATLAB, uint * double = uint, so must coerce cdata to double% Thanks to O Yamashita for pointing this need outidx = ceil( (double(cdata) - cax(1)) / (cax(2)-cax(1)) * nColors); else %direct mappingidx = cdata;%10/8/09 in case direct data is non-int (e.g. image;freezeColors)% (Floor mimics how matlab converts data into colormap index.)% Thanks to D Armyr for the catchidx = floor(idx); end %clamp to [1, nColors]idx(idx<1) = 1;idx(idx>nColors) = nColors; %handle nans in idxnanmask = isnan(idx);idx(nanmask)=1; %temporarily replace w/ a valid colormap index %make true-color data--using current colormaprealcolor = zeros(siz); for i = 1:3,c = cmap(idx,i);c = reshape(c,siz);c(nanmask) = nancolor(i); %restore Nan (or nancolor if specified)realcolor(:,:,i) = c; end %apply new true-color color data %true-color is not supported in painters renderer, so switch out of that if strcmp(get(gcf,'renderer'), 'painters'), set(gcf,'renderer','zbuffer'); end %replace original CData with true-color data if ~strcmp(g.Type,'patch'), set(hh,'CData',realcolor); else set(hh,'faceVertexCData',permute(realcolor,[1 3 2])) end %restore clim (so colorbar will show correct limits) if ~isempty(parentAx), set(parentAx,'clim',originalClim) end end %loop on indexed-color objects % ============================================================================ %% Local functions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% getCDataHandles -- get handles of all descendents with indexed CData%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function hout = getCDataHandles(h)% getCDataHandles Find all objects with indexed CData %recursively descend object tree, finding objects with indexed CData% An exception: don't include children of objects that themselves have CData:% for example, scattergroups are non-standard hggroups, with CData. Changing% such a group's CData automatically changes the CData of its children, % (as well as the children's handles), so there's no need to act on them. error(nargchk(1,1,nargin,'struct')) hout = [];if isempty(h),return;end ch = get(h,'children');for hh = ch' g = get(hh); if isfield(g,'CData'), %does object have CData? %is it indexed/scaled? if ~isempty(g.CData) && isnumeric(g.CData) && size(g.CData,3)==1, hout = [hout; hh]; %#ok<AGROW> %yes, add to list end else %no CData, see if object has any interesting children hout = [hout; getCDataHandles(hh)]; %#ok<AGROW> endend%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% getParentAxes -- return handle of axes object to which a given object belongs%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function hAx = getParentAxes(h)% getParentAxes Return enclosing axes of a given object (could be self)error(nargchk(1,1,nargin,'struct'))%object itself may be an axisif strcmp(get(h,'type'),'axes'), hAx = h; returnendparent = get(h,'parent');if (strcmp(get(parent,'type'), 'axes')), hAx = parent;else hAx = getParentAxes(parent);end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% checkArgs -- Validate input arguments%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function [h, nancolor] = checkArgs(args)% checkArgs Validate input arguments to freezeColorsnargs = length(args);error(nargchk(0,3,nargs,'struct'))%grab handle from first argument if we have an odd number of argumentsif mod(nargs,2), h = args{1}; if ~ishandle(h), error('JRI:freezeColors:checkArgs:invalidHandle',... 'The first argument must be a valid graphics handle (to an axis)') end % 4/ check if object to be frozen is a colorbar if strcmp(get(h,'Tag'),'Colorbar'),if ~exist('cbfreeze.m'), warning('JRI:freezeColors:checkArgs:cannotFreezeColorbar',... ['You seem to be attempting to freeze a colorbar. This no longer'... 'works. Please read the help for freezeColors for the solution.'])else cbfreeze(h); returnend end args{1} = []; nargs = nargs-1;else h = gca;end%set nancolor if that option was specifiednancolor = [nan nan nan];if nargs == 2, if strcmpi(args{end-1},'nancolor'), nancolor = args{end}; if ~all(size(nancolor)==[1 3]), error('JRI:freezeColors:checkArgs:badColorArgument',...'nancolor must be [r g b] vector'); end nancolor(nancolor>1) = 1; nancolor(nancolor<0) = 0; else error('JRI:freezeColors:checkArgs:unrecognizedOption',... 'Unrecognized option (%s). Only ''nancolor'' is valid.',args{end-1}) endend

转载自:/u012366767/article/details/82703670

如果觉得《Matlab--二次多项式曲面拟合》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。