Matlab程序解读

Matlab程序解读,第1张

fzero的功能是函数的数值求解,使用方式是

outx= fzero(fun,x0)

其中fun是要求解函数的句柄,fun要求只有一个输入变量x

x0是你给出的初始x值,

函数会在这个初始x值开始在附近需找一个x值,使得fun返回值为0

返回值outx就是也就是找到fun=0的根

你程序原来有,x,y两组数据

首先用p=polyfit(x,y,2),将数据拟合为二次函数

然后x0 = fzero( @(x)polyval(p,x)-0.5, (x(1)+x(end))/2 )

就是用fzero 找出这个二次函数=0.5时的根

而(x(1)+x(end))/2就是原来数据的第一个值和最后一个值的平均值

在这里用这个平均值,作为初始值,在其附近寻找 二次函数=0.5这个方程的根

引用一下别人的

df是自由度

normr是标准偏差

MATLAB软件提供了基本的曲线拟合函数的命令.

多项式函数拟合:a=polyfit(xdata,ydata,n)

其中n表示多项式的最高阶数,xdata,ydata为将要拟合的数据,它是用数组的方式输入.输出参数a为拟合多项式 y=a1xn+...+anx+a n+1的系数

多项式在x处的值y可用下面程序计算.

y=polyval(a,x,m)

线性:m=1, 二次:m=2, …

polyfit的输出是一个多项式系数的行向量。为了计算在xi数据点的多项式值,调用MATLAB的函数polyval。

例:

x=0:0.1:1

y=[-0.447 1.978 3.28 6.16 7.08 7.34 7.66 9.56 9.48 9.30 11.2]

A=polyfit(x,y,2)

Z=polyval(A,x)

Plot(x,y,’r*’,x,z,’b’)

polyfit不能保证你每次都能得到最优解,math的答案是使用数值计算。

个人认为,对于这种非线性的曲线,尽量不要使用ployfit, ployfit多项式抑合适合线性方程!!

用polyfit()函数去拟合这么复杂的曲线不太合适,polyfit()函数对于数据遵循多项式分布是比较好的,一般来说,利用polyfit()函数拟合的阶数不要超过5阶。

如果是不需要得到拟合曲线的函数,只是把这些点利用一些光滑曲线连接,建议使用三次样条函数spline()进行插值即可。

polyfit.m 在MATLAB安装目录下 \toolbox\matlab\polyfun

function [p,S,mu] = polyfit(x,y,n)

%POLYFIT Fit polynomial to data.

% P = POLYFIT(X,Y,N) finds the coefficients of a polynomial P(X) of

% degree N that fits the data Y best in a least-squares sense. P is a

% row vector of length N+1 containing the polynomial coefficients in

% descending powers, P(1)*X^N + P(2)*X^(N-1) +...+ P(N)*X + P(N+1).

%

% [P,S] = POLYFIT(X,Y,N) returns the polynomial coefficients P and a

% structure S for use with POLYVAL to obtain error estimates for

% predictions. S contains fields for the triangular factor (R) from a QR

% decomposition of the Vandermonde matrix of X, the degrees of freedom

% (df), and the norm of the residuals (normr). If the data Y are random,

% an estimate of the covariance matrix of P is (Rinv*Rinv')*normr^2/df,

% where Rinv is the inverse of R.

%

% [P,S,MU] = POLYFIT(X,Y,N) finds the coefficients of a polynomial in

% XHAT = (X-MU(1))/MU(2) where MU(1) = MEAN(X) and MU(2) = STD(X). This

% centering and scaling transformation improves the numerical properties

% of both the polynomial and the fitting algorithm.

%

% Warning messages result if N is >= length(X), if X has repeated, or

% nearly repeated, points, or if X might need centering and scaling.

%

% Class support for inputs X,Y:

% float: double, single

%

% See also POLY, POLYVAL, ROOTS.

% Copyright 1984-2004 The MathWorks, Inc.

% $Revision: 5.17.4.5 $ $Date: 2004/07/05 17:01:37 $

% The regression problem is formulated in matrix format as:

%

%y = V*por

%

% 3 2

%y = [x x x 1] [p3

% p2

% p1

% p0]

%

% where the vector p contains the coefficients to be found. For a

% 7th order polynomial, matrix V would be:

%

% V = [x.^7 x.^6 x.^5 x.^4 x.^3 x.^2 x ones(size(x))]

if ~isequal(size(x),size(y))

error('MATLAB:polyfit:XYSizeMismatch',...

'X and Y vectors must be the same size.')

end

x = x(:)

y = y(:)

if nargout >2

mu = [mean(x)std(x)]

x = (x - mu(1))/mu(2)

end

% Construct Vandermonde matrix.

V(:,n+1) = ones(length(x),1,class(x))

for j = n:-1:1

V(:,j) = x.*V(:,j+1)

end

% Solve least squares problem.

[Q,R] = qr(V,0)

ws = warning('off','all')

p = R\(Q'*y) % Same as p = V\y

warning(ws)

if size(R,2) >size(R,1)

warning('MATLAB:polyfit:PolyNotUnique', ...

'Polynomial is not uniquedegree >= number of data points.')

elseif condest(R) >1.0e10

if nargout >2

warning('MATLAB:polyfit:RepeatedPoints', ...

'Polynomial is badly conditioned. Remove repeated data points.')

else

warning('MATLAB:polyfit:RepeatedPointsOrRescale', ...

['Polynomial is badly conditioned. Remove repeated data points\n' ...

' or try centering and scaling as described in HELP POLYFIT.'])

end

end

r = y - V*p

p = p.' % Polynomial coefficients are row vectors by convention.

% S is a structure containing three elements: the triangular factor from a

% QR decomposition of the Vandermonde matrix, the degrees of freedom and

% the norm of the residuals.

S.R = R

S.df = length(y) - (n+1)

S.normr = norm(r)

q=1:3;

i=find(q>0,1) %找到q中第一个大于零的数的下标,存到变量i中

ii=q(i) %将q中第i个数,存到ii中

%这两句之后,i就是从q找到的大于0的第一个数的下标,ii等于这个数

while(~isempty(ii)&&(iter>0)) %当ii不是空矩阵并且iter大于零的时候执行下面循环

q(q==ii)=0%q中所有等于ii的数都改清0

[v,j]=max(w(ii,:)-p) %返回w中第ii列减去p之后的最大值 v,以及最大值的位置j

........


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11540256.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存