필터 지우기
필터 지우기

Add polynomial trendline to plot using script (m file) and code optimisation?

조회 수: 6 (최근 30일)
J
J 2015년 6월 6일
댓글: dpb 2015년 6월 7일
Hi,
I'd like to be able to add a trendline to my plot on figure(2) coding it in the m file. How would I go about doing that? It's currently only coming up as data points. My code is included below. Also, any potential optimizations in what I've currently written?
% Propulsion & Turbomachinery Lab
%%Define Variables
length_moment_arm = 94; % mm
pressure = 1.02; % bar
density = (1.02*10^5)/(287*(19+273)); %kg/m^3
rotate_speed_n_rev = 100; % rev/s
rotate_speed_n_rad = rotate_speed_n_rev*2*pi; % rad/s
%%Thrust Calibration
thrust_temp = 19; % degrees
thrust_volts = [-0.1302, -0.3611, -0.2429, -0.8304, -0.482,...
-0.7148, -0.9475, -0.1875, -1.0636, -0.5989]';
calibration_mass_g = [0, 100, 50, 300, 150, 250, 350, 25, ...
400, 200];
calibration_mass_kg = calibration_mass_g(:)/1000;
calibration_force = calibration_mass_kg(:)*9.81;
thrust_volts = sort(thrust_volts,1,'descend');
calibration_force = sort(calibration_force);
sens_thrust = ((thrust_volts(10)-thrust_volts(1))/...
(calibration_force(10)-calibration_force(1)));
c_thrust = thrust_volts(1);
%%Torque Calibration
torque_temp = 18; % degrees
torque_volts = [0.1180, 0.5823, 0.3506, 1.5138, 0.8185, 1.2833,...
1.9809, 1.7476, 0.234, 1.0510];
torque_volts = sort(torque_volts);
sens_torque = ((torque_volts(10)-torque_volts(1))/...
(calibration_force(10)-calibration_force(1)));
c_torque = torque_volts(1);
%%4 inch (10cm) pitch
prop1_d_cm = 25; % cm
prop1_d_m = prop1_d_cm/100; % m
prop1_thrust_offset_start = -0.0717; % Volts
prop1_thrust_offset_end = -0.1166; % Volts
prop1_thrust_offset_avg = (prop1_thrust_offset_start+prop1_thrust_offset_end)/2;
prop1_torque_offset_start = 0.0342; % Volts
prop1_torque_offset_end = 0.0353; % Volts
prop1_torque_offset_avg = (prop1_torque_offset_start+prop1_torque_offset_end)/2;
prop1_tunnel_velocity_min = 0:200:1200; % rev/min
prop1_tunnel_velocity_sec = prop1_tunnel_velocity_min/60; % rev/sec
prop1_thrust_volts = [-1.0438, -0.9779, -0.8025, -0.5777, -0.347, -0.1337, 0.1423]; % Volts
prop1_torque_volts = [0.331, 0.3344, 0.3103, 0.2617, 0.1975, 0.1246, 0.0176]; % Volts
prop1_delta_p = [0, 5, 16, 33, 60, 88, 137]; % Pa
prop1_tunnel_velocity_ms = (2.2*prop1_delta_p)/density).^0.5;
prop1_thrust = [prop1_thrust_volts-prop1_thrust_offset_avg]/sens_thrust; % Newtons
prop1_torque = [prop1_torque_volts-prop1_torque_offset_avg]/sens_torque; % Newtons
prop1_adv_ratio_J = prop1_tunnel_velocity_ms/(rotate_speed_n_rev*prop1_d_m);
prop1_CT = prop1_thrust/(density*(rotate_speed_n_rev^2)*(prop1_d_m^4));
prop1_CQ = prop1_torque/(density*(rotate_speed_n_rev^2)*(prop1_d_m^5));
prop1_power = prop1_torque*rotate_speed_n_rev;
prop1_prop_eff = (prop1_thrust.*prop1_tunnel_velocity_sec)./prop1_power;
%%Plotting section
figure(1)
subplot(1,2,1)
plot(calibration_force,thrust_volts)
grid on
title('Thrust Calibration')
xlabel('Force Applied (Newtons, N)')
ylabel('Thrust (Volts, V)')
subplot(1,2,2)
plot(calibration_force,torque_volts)
grid on
title('Torque Calibration')
xlabel('Force Applied (Newtons, N)')
ylabel('Torque (Volts, V)')
figure(2)
for x = 1:6
hold on
plot(prop1_adv_ratio_J(1,x),prop1_prop_eff(1,x),'bo')
title('Propulsive Effiency vs. Advance Ratio')
xlabel('Advance Ratio, J')
ylabel('Propulsive Effiency')
end
  댓글 수: 3
J
J 2015년 6월 6일
Thanks!
So, having watched this video... https://www.youtube.com/watch?v=K2dsK3FFbik
I came up with this:
p1 = polyfit(prop1_adv_ratio_J(1,1:6),prop1_prop_eff(1,1:6),5)
t_interest = linspace(0,prop1_adv_ratio_J(6),100)
y_interest = polyval(p1,t_interest)
plot(t_interest,y_interest)
grid on
Works great, but how can I add now add the equation of the best fit line to a specific place on the plot? e.g. y = x^5 + x^4 + x^3 ...etc.
dpb
dpb 2015년 6월 7일
You used the fit from
p1=polyfit(J(1:6),eff(1:6),5);
(with variables/indices shortened to key differences for clarity...)
BAD IDEA!!! A fifth-order polynomial with only six datapoints is likely to have undesired inflection points in general. Turns out with your data it's not as bad as one might fear but try
x=linspace(0,prop1_adv_ratio_J(1,6),100);
p4=polyfit(prop1_adv_ratio_J(1,1:6),prop1_prop_eff(1,1:6),4);
y4=polyval(p4,x);
hold on
plot(x,y4,'r:')
p3=polyfit(prop1_adv_ratio_J(1,1:6),prop1_prop_eff(1,1:6),3);
y3=polyval(p4,x);
plot(x,y3,'g:')
The lesser orders have a little more prediction error but not the inflection of the 5th order between the first two points.
If you want an interpolating polynomial instead of a model, I suggest using an interpolating spline instead of one polynomial instead.
If

댓글을 달려면 로그인하십시오.

답변 (1개)

Star Strider
Star Strider 2015년 6월 7일
‘how can I add now add the equation of the best fit line to a specific place on the plot? e.g. y = x^5 + x^4 + x^3 ...etc.’
Use the text function or its friends.

카테고리

Help CenterFile Exchange에서 Discrete Data Plots에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by