(高分)如何用matlab直接获得一张图片(折线图)上的数据?
因为数据很大量,希望能有解决办法,谢谢了数据的点的间隔要尽量小。能不能给出稍微详细点的解释,谢谢...
因为数据很大量,希望能有解决办法,谢谢了
数据的点的间隔要尽量小。
能不能给出稍微详细点的解释,谢谢 展开
数据的点的间隔要尽量小。
能不能给出稍微详细点的解释,谢谢 展开
展开全部
这其实是数值分析里最基本的问题,也就是插值问题。解决的方法也有很多,最常用的是多项式插值,还有beizier插值什么的。多项式插值就是构造一个多项式,他穿过你给的所有点。而且又由于是多项式所以必然光滑
至于多项式插值的具体实现,方法也是多种多样,就本人所学的最常用的是利用newton法构造差商表来求此多项式系数,如果你有兴趣去随便买一本数值分析或者数值逼近的书,上面都有详细的介绍(比如说复旦大学的《数值逼近》,蒋尔雄)。这个算法我以前写过,也许还有很多不足的地方,但足够解决你这个问题:
%下面这个函数是算多项式系数的,请保存成newton.m
%-------------------------------------
function y=newton(x,y)
temp=y(1);
k=length(x);
for i=1:k-1
for j=1:k-i
y(j)=(y(j+1)-y(j))/(x(j+i)-x(j));
end;
y(1+k-i)=y(1);
end;
y(1)=temp;
%-----------------------------------------------
算完多项式系数后腰根据系数算给定点的值,所以写了一个newton_eval函数,如下:
%这个程序请保存成newton_eval.m
%--------------------------------------------------------
% c means the polynomial's factor
% x,y is the knots
% z is a variable
% k is how many knots do we have
% this function can evaluate the polynomial which use y as its factor
function f=newton_eval(z,x,y)
c=newton(x,y);
[m,n]=size(z);
k=length(x);
f(1:n)=(z(1:n)-x(k-1)).*c(2);
for i=k-1:-1:2
f(1:n)=(f(1:n)+c(-i+k+2)).*(z(1:n)-x(i-1));
end;
f(1:n)=f(1:n)+y(1);
%---------------------------------------------------
最后就是主程序啦,随便取个名字就行,然后运行这个主程序就OK了
%--------------------------------------main 程序
clc;
close all;
clear;
t=[1.1, 2.6, 3.4, 5.4, 6.1];
x=3*t.^2;
y1=20.36*t.^3+12;
y2=17.25*t.^2-2.3;
y3=12.23*x.^3-21.3;
y4=7.86*x.^4+23.6;
tt=linspace(x(1),x(5),1000);
f1tt=newton_eval(tt,x,y1);
fig1=subplot(2,2,1);
plot(x,y1,'o');
hold on;
line1=plot(tt,f1tt,'-r');
hold on;
legend(fig1,line1,'x-y1插值曲线');
f2tt=newton_eval(tt,x,y2);
fig2=subplot(2,2,2);
plot(x,y2,'o');
hold on;
line2=plot(tt,f2tt,'-r');
legend(fig2,line2,'x-y2插值曲线');
f3tt=newton_eval(tt,x,y3);
fig3=subplot(2,2,3);
plot(x,y3,'o')
hold on;
line3=plot(tt,f3tt,'-r');
legend(fig3,line3,'x-y3插值曲线');
f4tt=newton_eval(tt,x,y4);
fig4=subplot(2,2,4);
plot(x,y4,'o')
hold on;
line4=plot(tt,f4tt,'-r');
legend(fig4,line4,'x-y4插值曲线');
%---------------------------------------------------------
至于那两个函数为什么那么写,就需要你自己去学习一下数值数学的基本知识了
至于多项式插值的具体实现,方法也是多种多样,就本人所学的最常用的是利用newton法构造差商表来求此多项式系数,如果你有兴趣去随便买一本数值分析或者数值逼近的书,上面都有详细的介绍(比如说复旦大学的《数值逼近》,蒋尔雄)。这个算法我以前写过,也许还有很多不足的地方,但足够解决你这个问题:
%下面这个函数是算多项式系数的,请保存成newton.m
%-------------------------------------
function y=newton(x,y)
temp=y(1);
k=length(x);
for i=1:k-1
for j=1:k-i
y(j)=(y(j+1)-y(j))/(x(j+i)-x(j));
end;
y(1+k-i)=y(1);
end;
y(1)=temp;
%-----------------------------------------------
算完多项式系数后腰根据系数算给定点的值,所以写了一个newton_eval函数,如下:
%这个程序请保存成newton_eval.m
%--------------------------------------------------------
% c means the polynomial's factor
% x,y is the knots
% z is a variable
% k is how many knots do we have
% this function can evaluate the polynomial which use y as its factor
function f=newton_eval(z,x,y)
c=newton(x,y);
[m,n]=size(z);
k=length(x);
f(1:n)=(z(1:n)-x(k-1)).*c(2);
for i=k-1:-1:2
f(1:n)=(f(1:n)+c(-i+k+2)).*(z(1:n)-x(i-1));
end;
f(1:n)=f(1:n)+y(1);
%---------------------------------------------------
最后就是主程序啦,随便取个名字就行,然后运行这个主程序就OK了
%--------------------------------------main 程序
clc;
close all;
clear;
t=[1.1, 2.6, 3.4, 5.4, 6.1];
x=3*t.^2;
y1=20.36*t.^3+12;
y2=17.25*t.^2-2.3;
y3=12.23*x.^3-21.3;
y4=7.86*x.^4+23.6;
tt=linspace(x(1),x(5),1000);
f1tt=newton_eval(tt,x,y1);
fig1=subplot(2,2,1);
plot(x,y1,'o');
hold on;
line1=plot(tt,f1tt,'-r');
hold on;
legend(fig1,line1,'x-y1插值曲线');
f2tt=newton_eval(tt,x,y2);
fig2=subplot(2,2,2);
plot(x,y2,'o');
hold on;
line2=plot(tt,f2tt,'-r');
legend(fig2,line2,'x-y2插值曲线');
f3tt=newton_eval(tt,x,y3);
fig3=subplot(2,2,3);
plot(x,y3,'o')
hold on;
line3=plot(tt,f3tt,'-r');
legend(fig3,line3,'x-y3插值曲线');
f4tt=newton_eval(tt,x,y4);
fig4=subplot(2,2,4);
plot(x,y4,'o')
hold on;
line4=plot(tt,f4tt,'-r');
legend(fig4,line4,'x-y4插值曲线');
%---------------------------------------------------------
至于那两个函数为什么那么写,就需要你自己去学习一下数值数学的基本知识了
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询