程序如下:附件中data.txt必须和程序放在同一文件夹中。
load data.txty=data(:,1)
x=1:1:length(y)
a1=polyfit(x',y,5)
syms X
f3=vpa(poly2sym(a1,X),4)%多项式5次拟合结果
x1=1:0.1:356
h1=polyval(a1,x1)
plot(x,y,'.',x1,h1,'r')
xlabel('x')
ylabel('y')
title('拟合拟合曲线')
legend('原始数据点','拟合')
结果:
f3 =
- 5.582e-10*X^5 + 6.199e-7*X^4 - 0.0002665*X^3 + 0.05546*X^2 - 5.605*X + 237.2
matlab是一个很强大的数据处理软件,是人们进行数据分析的得力助手。一般我们做社会调研或科学研究时,会得到很多实验数据。当需要研究两个变量之间的关系时,经常要用到曲线拟合。曲线拟合不仅能给出拟合后的关系式,还能用图形直观的展现出变量之间的关系。其实用matlab做曲线拟合很便捷,下面将以两个变量(y=f(x))为例详细介绍:
运行matlab软件。
在工作空间中存入变量的实验数据。具体如下:
可以直接用矩阵来存放数据,直接在命令窗口输入
x=[数据x1,数据x2,...,数据xn]
y=[数据y1,数据y2,...,数据yn]
当数据较多时,可以从excel,txt等文件中导入。
把数据存入工作空间后,在命令窗口中输入cftool,回车运行。
在这个拟合工具窗口的左边,选择变量,即分别选择x,y。
选择拟合的曲线类型,一般是线性拟合,高斯曲线,平滑曲线等,根据需要选择。
选择完后会自动完成拟合,并且给出拟合函数表达式。
program datareadimplicit none
integer::I,J,K
integer::Mx1,Mx2,N1,N2
character(len=20)::file1,file2,file3
character ans
real,dimension(:),allocatable::data1,data2
file1="1.txt"
file2="2.txt"
file3="3.txt"
open(11,file= trim(file1),status="old",err=998)
open(12,file= trim(file2),status="old",err=998)
open(13,file= trim(file3))
Mx1=0
N1=0
do
read(11,*,end=22)I
write(*,*)"1",I
if (Mx1<I) Mx1=I
N1=N1+1
enddo
22 Mx2=0
N2=0
do
read(12,*,end=23)I
write(*,*)"2",I
if (Mx2<I) Mx2=I
N2=N2+1
enddo
if(N1.ne.N2) then
write(*,*)"Data Numbers in two files are not the same, do you still wanna continue?(Y/N)"
read(*,*)ans
if(ans.eq."N") stop " Sorry, merge data can not be finished."
endif
23allocate(data1(N1),data2(N2))
rewind 11
rewind 12
do I=1,min(N1,N2)
read(11,*)J,data1(I)
read(12,*)K,data2(I)
if(J.ne.K) then
write(*,*) "Warning, numbers are not the same in two files"
endif
write(13,"(2F10.3)")data1(I),data2(I)
enddo
goto 999
998 stop "File can not be found!"
999 stop "Normal End"
end
由于不是很了解数据到底是什么样的,所以在写程序的时候并没有前面编号不一致的情况,但是扩展性还是留下了,那个Mx1和Mx2目的就是为了防止楼主万一要拓展,要求用编号控制对应的数字或者编号不是按照对应顺序的。反正这个代码是基本能实现楼主的要求了。如果1和2文件中的数字个数不一致的话,程序会提醒并询问是否继续,要是继续的话就按照个数最小的那个文件个数来排序。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)