我的脚本应该运行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)
答案 0 :(得分:0)
您的polyfit系列应为:
p = polyfit(Area,I(l, Index(l)-2:Index(l)+2),4);
更有趣的是,请注意关于该多项式的不良调节的警告(我假设您正在看到这些)。为什么?部分是因为数值精度(你的数字非常小,大约10 ^ -6),部分是因为你要求四阶拟合到五点(这是单数)。为了做到“更好”,使用更多的输入点(超过5个),或者使用低阶多项式拟合(二次方通常很多),并且(可能)在使用polyfit工具之前重新缩放。
话虽如此,实际上这个问题通常是用三点和二次拟合来解决的,因为它的计算成本低廉,并且给出了与更复杂的方法几乎相同的答案,但你没有从我那里得到它(无噪音)像这样的数据,无论如何都没关系。)