Second order coupled differential equation

4 次查看(过去 30 天)
I need help in solving the second order coupled differential equations as I'm unable to get the right solution after spending many days.
I want to solve it with two for loops (One for frequency and other for Resistance), but unfortunatly it doesnt work well. I would be very happy if someone can help me in this regard.
I am sharing my code to be more precise.
X0 = [0; 0; 0]; % initial conditions
r = linspace(1, 50, 100); % resistance range
freq_vector = linspace(1, 20, 20); % frequency range
options = odeset('RelTol', 1e-6, 'AbsTol', 1e-6);
% Initialize array to store average power values over frequency range
avgpower_total = zeros(length(freq_vector), length(r));
% Loop over frequencies
for j = 1:length(freq_vector)
w = freq_vector(j); % Current frequency
avgpower = zeros(1, length(r));
tspan = linspace(0,100, 100);
F = 0.8*9.81*cos(w*tspan);
% Loop over resistance values
for i = 1:length(r)
R = r(i); % Current resistance
% Solve ODE using ode45
[t, X] = ode45(@(t, X) VoltResistFun2(t, X, R,F, tspan,w), tspan, X0, options);
% Extraction of voltage value from the solution
Voltage = X(:, 3); % Third state variable
% Calculation of power
P = Voltage.^2 / R;
% Integrated power over time
IntegratedPower = trapz(t, P);
% Calculate average power
avgpower(i) = IntegratedPower / (t(end) - t(1)); % Divide by total time
end
% Store average power for current frequency
avgpower_total(j, :) = avgpower;
% keyboard
end
% Integrate the power over the frequency range and divide by the range
avg_power_over_range = trapz(freq_vector, avgpower_total, 1) / (freq_vector(end) - freq_vector(1));
function dxdt = VoltResistFun2(t, X, R,F, tspan,w)
% Parameters
g = 9.81; % m/s^2
M = 0.01; % proof mass
t_p = 0.01; % thickness
A_p = 0.0001; % area
M_p = 0.00075; % proof mass
E_33 = 1.137e-8; % permittivity
k_33 = 0.75; % electromechanical coupling
e_33 = -1; % value of e_33
m = M + (1/3) * M_p;
C_p = E_33 * A_p / t_p;
theta = -(e_33 * A_p / t_p);
alpha = 1 ./ R;
w0 = 2 * pi * 20;
% F = 0.8 * g*cos(t); % external force
z = 0.02; % damping coefficient
f = interp1(tspan, F.*cos(w*t), t);
% Define state-space matrices
A = [0 1 0; -w0^2 -2*z*w0 -theta/m; 0 theta/C_p -alpha/C_p];
B = [0; -1; 0];
% Calculate derivative of state vector
% keyboard
dxdt = A\(X - B*f);
% Ensure dxdt is a column vector
% dxdt = dxdt(:);
end
Note :
eqution1 = x" +2zetaw_0x' +w_0^2x+theta/m= -F
F is defined
1/R = alpha
Thanks in advance

采纳的回答

Torsten
Torsten 2024-5-30
编辑:Torsten 2024-5-30
X0 = [0; 0; 0]; % initial conditions
r = linspace(1, 50, 100); % resistance range
tspan = linspace(0,100, 100);
freq_vector = linspace(1, 20, 20); % frequency range
%options = odeset('RelTol', 1e-6, 'AbsTol', 1e-6);
% Initialize array to store average power values over frequency range
avgpower_total = zeros(length(freq_vector), length(r));
% Loop over frequencies
for j = 1:length(freq_vector)
w = freq_vector(j); % Current frequency
avgpower = zeros(1, length(r));
F = @(t)0.8*9.81*cos(w*t);
% Loop over resistance values
for i = 1:length(r)
R = r(i); % Current resistance
% Solve ODE using ode45
[t, X] = ode45(@(t, X) VoltResistFun2(t, X, R,F), tspan, X0);%, options);
% Extraction of voltage value from the solution
Voltage = X(:, 3); % Third state variable
% Calculation of power
P = Voltage.^2 / R;
% Integrated power over time
IntegratedPower = trapz(t, P);
% Calculate average power
avgpower(i) = IntegratedPower / (t(end) - t(1)); % Divide by total time
end
% Store average power for current frequency
avgpower_total(j, :) = avgpower;
% keyboard
end
% Integrate the power over the frequency range and divide by the range
avg_power_over_range = trapz(freq_vector, avgpower_total, 1) / (freq_vector(end) - freq_vector(1))
avg_power_over_range = 1x100
1.0e-09 * 0.0067 0.0100 0.0133 0.0166 0.0199 0.0232 0.0265 0.0298 0.0331 0.0364 0.0396 0.0429 0.0462 0.0495 0.0528 0.0561 0.0594 0.0627 0.0660 0.0693 0.0726 0.0759 0.0792 0.0825 0.0858 0.0891 0.0924 0.0957 0.0990 0.1023
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
plot(r,avg_power_over_range)
function dxdt = VoltResistFun2(t, X, R,F)
% Parameters
g = 9.81; % m/s^2
M = 0.01; % proof mass
t_p = 0.01; % thickness
A_p = 0.0001; % area
M_p = 0.00075; % proof mass
E_33 = 1.137e-8; % permittivity
k_33 = 0.75; % electromechanical coupling
e_33 = -1; % value of e_33
m = M + (1/3) * M_p;
C_p = E_33 * A_p / t_p;
theta = -(e_33 * A_p / t_p);
alpha = 1 ./ R;
w0 = 2 * pi * 20;
% F = 0.8 * g*cos(t); % external force
z = 0.02; % damping coefficient
f = F(t);
% Define state-space matrices
A = [0 1 0; -w0^2 -2*z*w0 -theta/m; 0 theta/C_p -alpha/C_p];
B = [0; -1; 0];
% Calculate derivative of state vector
% keyboard
dxdt = A\(X - B*f);
% Ensure dxdt is a column vector
% dxdt = dxdt(:);
end
  8 个评论
Sam Chak
Sam Chak 2024-5-30
Your systems are technically stable by definition. However, their dominant eigenvalues have relatively large imaginary components. If you wish to obtain the desired response, then you must inject an external tunable signal that is derived from the desired response by applying some standard textbook formulas. I believe MATLAB also has the capability to automatically tune the tunable signal to produce the desired response.
R = 1:2:49;
for i = 1:numel(R)
% Parameters
g = 9.81; % m/s^2
M = 0.01; % proof mass
t_p = 0.01; % thickness
A_p = 0.0001; % area
M_p = 0.00075; % proof mass
E_33 = 1.137e-8; % permittivity
k_33 = 0.75; % electromechanical coupling
e_33 = -1; % value of e_33
m = M + (1/3) * M_p;
C_p = E_33 * A_p / t_p;
theta = -(e_33 * A_p / t_p);
alpha = 1 ./ R(i);
w0 = 2 * pi * 20;
% F = 0.8 * g*cos(t); % external force
z = 0.02; % damping coefficient
% f = F(t);
% Define state-space matrices
A = [0 1 0; -w0^2 -2*z*w0 -theta/m; 0 theta/C_p -alpha/C_p];
eigenvalues = eig(A)
end
eigenvalues =
1.0e+09 * -0.0000 + 0.0000i -0.0000 - 0.0000i -8.7951 + 0.0000i
eigenvalues =
1.0e+09 * -0.0000 + 0.0000i -0.0000 - 0.0000i -2.9317 + 0.0000i
eigenvalues =
1.0e+09 * -0.0000 + 0.0000i -0.0000 - 0.0000i -1.7590 + 0.0000i
eigenvalues =
1.0e+09 * -0.0000 + 0.0000i -0.0000 - 0.0000i -1.2564 + 0.0000i
eigenvalues =
1.0e+08 * -0.0000 + 0.0000i -0.0000 - 0.0000i -9.7723 + 0.0000i
eigenvalues =
1.0e+08 * -0.0000 + 0.0000i -0.0000 - 0.0000i -7.9955 + 0.0000i
eigenvalues =
1.0e+08 * -0.0000 + 0.0000i -0.0000 - 0.0000i -6.7654 + 0.0000i
eigenvalues =
1.0e+08 * -0.0000 + 0.0000i -0.0000 - 0.0000i -5.8634 + 0.0000i
eigenvalues =
1.0e+08 * -0.0000 + 0.0000i -0.0000 - 0.0000i -5.1736 + 0.0000i
eigenvalues =
1.0e+08 * -0.0000 + 0.0000i -0.0000 - 0.0000i -4.6290 + 0.0000i
eigenvalues =
1.0e+08 * -0.0000 + 0.0000i -0.0000 - 0.0000i -4.1881 + 0.0000i
eigenvalues =
1.0e+08 * -0.0000 + 0.0000i -0.0000 - 0.0000i -3.8239 + 0.0000i
eigenvalues =
1.0e+08 * -0.0000 + 0.0000i -0.0000 - 0.0000i -3.5180 + 0.0000i
eigenvalues =
1.0e+08 * -0.0000 + 0.0000i -0.0000 - 0.0000i -3.2574 + 0.0000i
eigenvalues =
1.0e+08 * -0.0000 + 0.0000i -0.0000 - 0.0000i -3.0328 + 0.0000i
eigenvalues =
1.0e+08 * -0.0000 + 0.0000i -0.0000 - 0.0000i -2.8371 + 0.0000i
eigenvalues =
1.0e+08 * -0.0000 + 0.0000i -0.0000 - 0.0000i -2.6652 + 0.0000i
eigenvalues =
1.0e+08 * -0.0000 + 0.0000i -0.0000 - 0.0000i -2.5129 + 0.0000i
eigenvalues =
1.0e+08 * -0.0000 + 0.0000i -0.0000 - 0.0000i -2.3770 + 0.0000i
eigenvalues =
1.0e+08 * -0.0000 + 0.0000i -0.0000 - 0.0000i -2.2551 + 0.0000i
eigenvalues =
1.0e+08 * -0.0000 + 0.0000i -0.0000 - 0.0000i -2.1451 + 0.0000i
eigenvalues =
1.0e+08 * -0.0000 + 0.0000i -0.0000 - 0.0000i -2.0454 + 0.0000i
eigenvalues =
1.0e+08 * -0.0000 + 0.0000i -0.0000 - 0.0000i -1.9545 + 0.0000i
eigenvalues =
1.0e+08 * -0.0000 + 0.0000i -0.0000 - 0.0000i -1.8713 + 0.0000i
eigenvalues =
1.0e+08 * -0.0000 + 0.0000i -0.0000 - 0.0000i -1.7949 + 0.0000i
%% Dominant Poles
format long
eigenvalues(1)
ans =
-2.752298520445965e+00 + 1.256335621426667e+02i
Muhammad
Muhammad 2024-5-31
Understood. Thank you so much for your help

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Programming 的更多信息

产品


版本

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by