如何在MATLAB中根据有限的数据点得到函数.docx

上传人:b****8 文档编号:9781129 上传时间:2023-02-06 格式:DOCX 页数:40 大小:62.89KB
下载 相关 举报
如何在MATLAB中根据有限的数据点得到函数.docx_第1页
第1页 / 共40页
如何在MATLAB中根据有限的数据点得到函数.docx_第2页
第2页 / 共40页
如何在MATLAB中根据有限的数据点得到函数.docx_第3页
第3页 / 共40页
如何在MATLAB中根据有限的数据点得到函数.docx_第4页
第4页 / 共40页
如何在MATLAB中根据有限的数据点得到函数.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

如何在MATLAB中根据有限的数据点得到函数.docx

《如何在MATLAB中根据有限的数据点得到函数.docx》由会员分享,可在线阅读,更多相关《如何在MATLAB中根据有限的数据点得到函数.docx(40页珍藏版)》请在冰豆网上搜索。

如何在MATLAB中根据有限的数据点得到函数.docx

如何在MATLAB中根据有限的数据点得到函数

如何在MATLAB中根据有限的数据点得到函数

悬赏分:

100 | 提问时间:

2010-5-2407:

28 | 提问者:

aptxyuchen

如何在MATLAB中根据有限的数据点得到函数

推荐答案

可以用多项式拟合方法做到,你可以通过实验得到拟合最好的阶数。

但是,如果你将阶数本身设的比较大的话,大多数曲线都可以很好的拟合出来。

数据拟合:

在MATLAB的NAGFoundationToolbox中也有一些曲面拟合函数,如e02daf是最小二乘平方曲面拟合函数,e02def可求出曲面拟合的函数值。

有关曲面拟合的基本原理参见有关数值分析的书籍,这里不再多说。

注:

关于在MATLAB的NAGFoundationToolbox中的函数形式、说明以及应用例子可以查阅帮助信息。

例如,键入helpe02daf便会出现函数e02daf的较详细说明。

在函数末尾加e便是应用的例子,如键入typee02daf,会显示函数e02daf的应用例子程序,键入e02daf,则运行该程序,并显示其计算结果。

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

多项式函数拟合:

a=polyfit(xdata,ydata,n)

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

多项式在x处的值y可用下面程序计算.y=polyval(a,x)

一般的曲线拟合:

p=curvefit(‘Fun’,p0,xdata,ydata)

其中Fun表示函数Fun(p,data)的M函数文件,p0表示函数的初值.curvefit()命令的求解问题形式是

若要求解点x处的函数值可用程序f=Fun(p,x)计算.

例如已知函数形式,并且已知数据点要确定四个未知参数a,b,c,d.使用curvefit命令,数据输入;初值输;并且建立函数的M文件(Fun.m).若定义,则输出又如引例的求解,MATLAB程序:

t=[l:

16];%数据输人y=[46.488.49.289.59.79.8610.210.3210.4210.510.5510.5810.6];plot(t,y,’o’)%画散点图p=polyfit(t,y,2)(二次多项式拟合)计算结果:

p=-0.04451.07114.3252%二次多项式的系数由此得到某化合物的浓度y与时间t的拟合函数

matlab曲线拟合后表达式怎么输出

悬赏分:

0 | 解决时间:

2010-5-911:

51 | 提问者:

meiyoudeyuwan

新手呀。

拟合图像已经做出来了函数中常量a,b,c....也知道,有没有直接输出函数的办法?

最佳答案

你是用什么拟合的

要是多项式拟合的就用p是拟合的结果

f=poly2sym(p)

f=

3*x^5+5*x^4+x^2+12

 

要是用lsqcurvefit你就在用subs把结果带入函数就好了

matlab用隐函数拟合的程序怎么编写

悬赏分:

100 | 解决时间:

2009-5-2716:

06 | 提问者:

liusy3132

试验测试得到x,y数据。

现在想通过用matlab用隐函数y=I1*exp((x-y*Rs)/0.026/n1)+I2*exp((x-y*Rs)/0.026/n2)+(x-y*Rs)/Rsh-I1-I2+IL对数据进行拟合。

得到参量I1、I2、IL、Rs、Rsh、n1、n2的数值。

请高手帮忙。

先谢谢了。

问题补充:

自变量x从0到1,每0.05取一个点。

对应的y值如下:

0,4.84827E-9

0.05,7.20861E-9

0.1,9.486E-9

0.15,1.33346E-8

0.2,1.85467E-8

0.25,2.54804E-8

0.3,3.57885E-8

0.35,4.94846E-8

0.4,6.86021E-8

0.45,9.34068E-8

0.5,1.36416E-7

0.55,2.18504E-7

0.6,4.51033E-7

0.65,1.2785E-6

0.7,4.57114E-6

0.75,1.70904E-5

0.8,5.62476E-5

0.85,1.45646E-4

0.9,2.93975E-4

0.95,4.91251E-4

1,7.21464E-4

y轴用的是指数坐标。

最佳答案

clear;clc

F=@(p,x)p

(1)*exp((x(:

1)-x(:

2)*p(4))/0.026/p(6))+p

(2)*exp((x(:

1)-x(:

2)*p(4))/0.026/p(7))+(x(:

1)-x(:

2)*p(4))/p(5)-p

(1)-p

(2)+p(3)-x(:

2);

x=[0,4.84827E-9

0.05,7.20861E-9

0.1,9.486E-9

0.15,1.33346E-8

0.2,1.85467E-8

0.25,2.54804E-8

0.3,3.57885E-8

0.35,4.94846E-8

0.4,6.86021E-8

0.45,9.34068E-8

0.5,1.36416E-7

0.55,2.18504E-7

0.6,4.51033E-7

0.65,1.2785E-6

0.7,4.57114E-6

0.75,1.70904E-5

0.8,5.62476E-5

0.85,1.45646E-4

0.9,2.93975E-4

0.95,4.91251E-4

1,7.21464E-4];

p0=[354109104];%%因为你这个函数很变态,初值选择不好得不到好结果,这个初值不错

warningoff

p=nlinfit(x,zeros(size(x,1),1),F,p0);

disp('I1、I2、IL、Rs、Rsh、n1、n2分别为:

');

disp(num2str(p));

plot(x(:

1),x(:

2),'ro');holdon;

ezplot(@(x,y)F(p,[x,y]),[0,1,-1e-3,1e-3]);

title('曲线拟合');legend('样本点','拟合曲线')

5

Matlab样条拟合函数

悬赏分:

20 | 解决时间:

2009-9-708:

35 | 提问者:

happyday0912

用Matlab中的最小二乘法拟合生成样条曲线,其中有这样一个函数,

sp=spaps(x,y,tol),

它有个输出参数是sp,代表拟合得到的样条函数,我想问能得到它的具体的函数表达式吗?

如果能,应该怎么得到?

谢谢

最佳答案

答案是可以得到具体表达式。

先运行sp=spaps(x,y,tol);

得到结果后运行

>>sp.coefs

得到每个多项式的系数向量,其实也就是多项式函数的具体表达式,相信你能看得出来。

matlab非线性拟合问题

悬赏分:

170 | 解决时间:

2011-1-2519:

07 | 提问者:

aweto_mm

已知f=J*Ld/Li(1-exp(-Ld/Li)),Ld=t*(Voc-x)在函数中J=21.18、Li=1*e-6、Voc=0.418。

f和X可以给定一系列值如下:

xf

51.885-21.4823

86.4-21.0836

134.73-20.98485

157.74-20.90685

240.6-20.30025

321.15-19.5936

374.05-16.960725

通过拟合求t各位大侠越详细越好哦!

希望给出程序代码及标注!

再次感谢!

最佳答案

要新建两个文件:

主文件,test.m

------------------------------------------------------------------------------

functiontest

clear

clc

x=[51.885;86.4;134.73;157.74;240.6;321.15;374.05];

f=[-21.4823;-21.0836;-20.98485;-20.90685;-20.30025;-19.5936;-16.960725];

ft=fittype('fit_func(x,t)');

cfun=fit(x,f,ft,'StartPoint',-0.01);%开始拟合

cfun%输出拟合参数等

plot(cfun,x,f)%画出拟合后曲线和原始数据点

end

函数文件,用于自定义的函数:

fit_func.m

------------------------------------------------------------------------------

functionf=fit_func(x,t)

J=21.18;

Li=1e-6;

Voc=0.418;

Ld=t*(Voc-x);

f=J*Ld./(Li*(1-exp(-Ld/Li)));

end

------------------------------------------------------------------------------

可以保证运行输出结果,运行后自动绘出曲线和原始数据点,但是结果可能不会令人满意。

我不保证编码时完全正确,但基本思想就是这样。

你需要仔细检查代码,试着调正fit函数中StartPoint,还有其他选项(参见文档中fitoptions的说明),直到曲线和数据点吻合到满意为止。

当然也可能是该函数不是这批数据点的理想模型,换成别的会更好。

如何根据一些离散点,用matlab拟合函数,函数未知,急!

急!

悬赏分:

25 | 提问时间:

2008-7-1917:

58 | 提问者:

matlablhl

z=[0.012,0.022,0.032,0.042,0.052,0.062,0.072,0.082,0.092,0.102,0.112,0.122,0.132,0.202,0.302,0.402,0.502,1.002,2.002,10.002,20.002];

NU=[8.0239,6.7271,6.0510,5.6209,5.3188,5.0939,4.9198,4.7812,4.6684,4.5751,4.4968,4.4303,4.3731,4.1216,3.9713,3.8931,3.8460,3.7516,3.7042,3.6663,3.6615]

需要得到NU和z的关系式。

问题补充:

函数关系式为NU=3.66+a1*x^a2/(1+a3*x^a3),如何确定a1,a2,a3,a4

答:

看离散点的关系应该是指数的吧,你建立一个指数的方程,转化成线性的,用最小二乘就可以了

matlab非线性最小二乘拟合

悬赏分:

100 | 解决时间:

2010-5-910:

07 | 提问者:

lmks000

我有801个点是由实验测得的数据。

现有公式

U1=1+((wd^2)*xd0*(wd^2-w^2))/((wd^2-w^2)^2+w^2*b^2)+xs0*ws^2*((ws^2-w^2)^2+w^2*a^2)

其中U1是测量值(因变量),w是自变量,也是已知条件。

其他六个未知数需要通过最小二乘拟合同时得到最优值。

我是菜鸟,所以希望大牛们能说清楚一些。

最好是能给出程序框架,我自己吧自变量因变量带进去搞出来。

搞定之后追加分.

先谢谢啦

有问题麻烦用qq问我278663192

问题补充:

非线性的

有人做出来拟合结果了

只是我查不到程序

 

你说得很对,我也发现结果是初值敏感的。

但这是所不希望的。

能不能有更好的解决方法呢?

帮帮忙吧!

谢谢你啦

最佳答案

MATLAB的最优化工具箱中提供了lsqcurvefit()函数,可以解决最小二乘曲线拟合的问题,改函数的调用格式为:

[a,J]=lsqcurvefit(Fun,a0,x,y)

其中,Fun未原型函数的MATLAB表示,a0未最优化的初值,x,y为原始输入输出数据向量,调用该函数将可以返回待定系数向量a以及在此待定系数下的目标函数的值J.(详细可以输入helplsqcurvefit)

具体做法是:

>>U1=inline('f(a,w)','a','w')%用a(i)分别代替六个未知数,i=1~6.

>>[xx,res]=lsqcurvefit(U1,[111111],w,U);xx'%w和U是你试验得出来的数据向量。

结果应该会出现一个ans向量(6维),分别就是你所要待定的系数a(i)了

matlb中函数拟合后如何用符号输出拟合多项式

悬赏分:

20 | 解决时间:

2008-5-1408:

49 | 提问者:

StayGallant

我用matlab进行多项式拟合

拟合之后我想将结果表示成多项式的形式进行输出

忘记是怎么输出的了

调试老是出错

请各位大虾指点:

A=[1,2,3,4];

B=[5,6,7,8];

temp=polyfit(A,B,1);

symsx;

y=polyval(temp,x)

错在哪里了,正确的方式应该是什么?

最佳答案

A=[1,2,3,4];

B=[5,6,7,8];

temp=polyfit(A,B,1);

y=poly2sym(temp,'x')

结果:

y=

x+4

matlab实现分段曲线拟合

悬赏分:

30 | 提问时间:

2009-5-1516:

34 | 提问者:

antyyy | 问题为何被关闭

由于前两个点差异很大,完全不符合整体趋势(的确是有效点),用polyfit()拟合出的曲线很差,都被第一个点弄乱了。

老师说应把前三个点和后面的分开,进行双次拟合。

可是怎么要只输出一条平滑的曲线,简单的分两次拟合的曲线怎么连在一起?

或者,有什么方法可以直接生成一条符合要求的曲线。

其他回答 共1条

那肯定是分段函数

先用前三个点建立一个函数

再用后面的地建立一个函数

如何用MATLAB对一个函数图拟合得到比较准确的公式?

悬赏分:

100 | 解决时间:

2009-4-2522:

05 | 提问者:

kaigoal

就是上传的图片里面中间那条曲线(Global)

问题补充:

能不能给出详细的程序?

最佳答案

图片太小,看不清楚,但是我给出一个别的例子(这个例子是我们老师上课时演示过的例子),跟你这个类似,可以参考一下,无论别人怎样回答,你都要知道matlab中用到的函数名的功能,自己一步步输入数据执行。

举例:

已知某镇近20年(79-98)的人口统计为:

3.90,5.30,7.20,9.60,12.90,17.10,23.10,31.400,38.60,50.20,62.90105.70179.0205.00,226.5试分别用一阶,二阶,四阶多项式和指数曲线拟合人口对年份的曲线。

pop1=[3.905.307.209.6012.9017.1023.1031.400]

pop2=[38.6050.2062.9076.092.0105.7022.80]

pop3=[131.70150.70179.0205.0226.50];

pop=[pop1,pop2,pop3]'

cdate=1979:

1998;

cdate=cdate'

p=polyfit(cdate,pop,4)

会出现:

Matrixisclosetosingularorbadlyscaled.

Resultsmaybeinaccurate.RCOND=3.000002e-024.

>InD:

\toolbox\matlab\polyfun\polyfit.matline52

Inc:

\matlabbk\qx2.matline7

应对cdate进行数据预处理,方法为:

sdate=(cdate-mean(date))./std(cdate)

对应的脚本程序为:

pop1=[3.905.307.209.6012.9017.1023.1031.400]

pop2=[38.6050.2062.9076.092.0105.7022.80]

pop3=[131.70150.70179.0205.0226.50]

pop=[pop1,pop2,pop3]'

cdate=1979:

1998;

cdate=cdate'

sdate=(cdate-mean(cdate))./std(cdate)

p=polyfit(sdate,pop,4)

运行该文件,可得到多项式的拟合曲线和误差曲线。

将预处理的人口数据的对数,进行一次拟合,对应的脚本程序为:

pop1=[3.905.307.209.6012.9017.1023.1031.400]

pop2=[38.6050.2062.9076.092.0105.7022.80]

pop3=[131.70150.70179.0205.0226.50]

pop=[pop1,pop2,pop3]'

cdate=1979:

1998;

cdate=cdate'

sdate=(cdate-mean(cdate))./std(cdate)

logp1=polyfit(sdate,log10(pop),1)

logpred1=10.^polyval(logp1,sdate)

semilogy(cdate,logpred1,'-',cdate,pop,'+')

gridon

得到的结果是:

10

y=1.5944(10.^0.5211x)

问题的关键在于你要事先观察数据连成的点符合什么分布,然后用这个分布去拟合,得到相应的参数,方差(最小二乘法),方差小的即为所要的曲线分布。

希望对你有帮助。

如何用matlab拟合模型分段函数

悬赏分:

5 | 解决时间:

2009-9-2610:

50 | 提问者:

chinatongue

实验数据和图见水木论坛

有一组实验数据,t表示时间,v表示电压

数据如后所见。

我现在编写一个m文件,试图分段拟合,但得不到预期的效果。

如果是分开拟合,则效果很好。

估计是这样编写的分段拟合不对,请大侠指教更好的程序。

下面是我编写的m文件

fun1=inline('4.213-300*x/ref

(1)-300*(ref

(2)+ref(3))+300*ref(3)*exp(-x/(ref(3)*ref(4)))','ref','x')

fun2=inline('4.213-3000/ref

(1)-300*ref(3)*exp(-x/(ref(3)*ref(4)))*(exp(10/(ref(3)*ref(4)))-1)','ref','x')

ift<=10

abc=nlinfit(t,v,fun1,[518910.000830.0001312050]);

else

abc=nlinfit(t,v,fun2,[518910.000830.0001312050]);

end

Cb=abc

(1),R0=abc

(2),Rp=abc(3),Cp=abc(4)

ift<=10

vv=4.213-300*t/Cb-300*(R0+Rp)+300*Rp*exp(-t/(Rp*Cp))

else

vv=4.213-3000/Cb-300*Rp*exp(-t/(Rp*Cp))*(exp(10/(Rp*Cp))-1)

end

plot(t,v,'*',t,vv)

问题补充:

fun1=inline('4.213-300*x/ref

(1)-300*(ref

(2)+ref(3))+300*ref(3)*exp(-x/(ref(3)*ref(4)))','ref','x');

fun2=inline('4.213-3000/ref

(1)-300*ref(3)*exp(-x/(ref(3)*ref(4)))*(exp(10/(ref(3)*ref(4)))-1)','ref','x');

fun=@(ref,t)((t<=10).*fun1(ref,t)+(t>10).*fun2(ref,t));

abc=nlinfit(t',v,fun,[518910.000830.0001312050]');

plot(t,v);holdon;

f=@(t)(fun(abc,t));

fplot(f,[0,50],'r')

该方案不行哦,只要稍微改变初始化条件,拟合结果差距就非常非常大!

最佳答案

你要知道,你要拟合的是一个分段函数,这本身就不是一般的连续光滑函数。

nlinfit之所以要有初值这一项,就是考虑到在某些变态的情况下,无法找到最小二乘函数的最小值,可能是一个局部的最小值,也可能根本找不到,所以有必要通过改变迭代初值的方法进行试验。

对于这种分段函数,最好的方法还是分段拟合。

fun1=inline('4.213-300*x/ref

(1)-300*(ref

(2)+ref(3))+300*ref(3)*exp(-x/(ref(3)*ref(4)))','ref','x');

fun2=inline('4.213-3000/ref

(1)-300*ref(3)*exp(-x/(ref(3)*ref(4)))*(exp(10/(ref(3)*ref(4)))-1)','ref','x');

fun=@(ref,t)((t<=10).*fun1(ref,t)+(t>10).*fun2(ref,t));

t=0:

0.1:

50;

v=[3.969

3.963

3.959

3.955

3.952

3.949

3.947

3.945

3.943

3.941

3.939

3.938

3.936

3.935

3.933

3.932

3.93

3.929

3.928

3.927

3.926

3.925

3.923

3.922

3.921

3.92

3.919

3.918

3.917

3.916

3.915

3.914

3.913

3.912

3.911

3.91

3.909

3.908

3.907

3.907

3.906

3.905

3.904

3.903

3.903

3.902

3.901

3.9

3.9

3.899

3.898

3.898

3.897

3.896

3.896

3.895

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 设计艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1