使用polyfit进行插值(Matlab)

时间:2015-05-10 18:26:09

标签: matlab interpolation

我的脚本应该运行Runge-Kutta,然后使用polyfit在顶部周围插值来计算顶部的最大值。我似乎得到了最大点的x值正确,但由于某种原因,y值是关闭的。已经和它坐了3天了。当我计算py时,问题应该是在最后一个for循环中?

功能:

function funk = FU(t,u)

L0 = 1;
C = 1*10^-6;

funk = [u(2);  2.*u(1).*u(2).^2./(1+u(1).^2) - u(1).*(1+u(1).^2)./(L0.*C)];

程序:

%Runge kutta

clear all
close all
clc
clf

%Given values
U0 = [240 1200 2400]; 
L0 = 1; 
C = 1*10^-6; 

T = 0.003; 
h = 0.000001; 

W = [];

% Runge-Kutta 4

for i = 1:3

    u0 = [0;U0(i)];

    u = u0;
    U = u;

    tt = 0:h:T;

    for t=tt(1:end-1)

        k1 = FU(t,u);
        k2 = FU(t+0.5*h,u+0.5*h*k1);
        k3 = FU((t+0.5*h),(u+0.5*h*k2));
        k4 = FU((t+h),(u+k3*h));

        u = u + (1/6)*(k1+2*k2+2*k3+k4)*h;

        U = [U u];
    end

    W = [W;U];

end

I1 = W(1,:); I2 = W(3,:); I3 = W(5,:);
dI1 = W(2,:); dI2 = W(4,:); dI3 = W(6,:);

I = [I1; I2; I3];
dI = [dI1; dI2; dI3];

%Plot of the currents
figure (1)
plot(tt,I1,'r',tt,I2,'b',tt,I3,'g')
hold on
legend('U0 = 240','U0 = 1200','U0 = 2400')

BB = []; 
d = 2;
px = [];
py = [];

format short

for l = 1:3

    [H,Index(l)]=max(I(l,:)); 

    Area=[(Index(l)-2:Index(l)+2)*h]; 
    p = polyfit(Area,I(Index(l)-2:Index(l)+2),4); 

   rotp(1,:) = roots([4*p(1),3*p(2),2*p(3),p(4)]); 

    B = rotp(1,2); 

    BB = [BB B]; 

    Imax(l,:)=p(1).*B.^4+p(2).*B.^3+p(3).*B.^2+p(4).*B+p(5);

    Tsv(i)=4*rotp(1,l); 


    %px1 = linspace(h*(Index(l)-d-1),h*(Index(l)+d-2));
    px1 = BB;
    py1 = polyval(p,px1(1,l));

    px = [px px1];
    py = [py py1];

end

% Plots the max points
    figure(1)
    plot(px1(1),py(1),'b*-',px1(2),py(2),'b*-',px1(3),py(3),'b*-')
    hold on

disp(Imax)

1 个答案:

答案 0 :(得分:0)

您的polyfit系列应为:

p = polyfit(Area,I(l, Index(l)-2:Index(l)+2),4);

更有趣的是,请注意关于该多项式的不良调节的警告(我假设您正在看到这些)。为什么?部分是因为数值精度(你的数字非常小,大约10 ^ -6),部分是因为你要求四阶拟合到五点(这是单数)。为了做到“更好”,使用更多的输入点(超过5个),或者使用低阶多项式拟合(二次方通常很多),并且(可能)在使用polyfit工具之前重新缩放。

话虽如此,实际上这个问题通常是用三点和二次拟合来解决的,因为它的计算成本低廉,并且给出了与更复杂的方法几乎相同的答案,但你没有从我那里得到它(无噪音)像这样的数据,无论如何都没关系。)