采用Wilson-θ法计算10x''+cx'+10=5sin(t/2)+2sin(t)+sin(2t),当c=3和c=20,x0=0,x'0=0前10s内的位移,作出其时间位移曲线图。Matlab程序
时间: 2024-03-01 15:50:31 浏览: 138
好的,以下是采用Wilson-θ法计算的Matlab程序。首先是定义参数和初始值:
```matlab
% 定义参数和初始值
c1 = 3; % c = 3
c2 = 20; % c = 20
h = 0.001; % 步长
tspan = [0, 10]; % 时间范围
x0 = 0; % 初始位移
v0 = 0; % 初始速度
theta = 0.25; % Wilson-θ法参数
```
然后是定义右侧函数:
```matlab
% 定义右侧函数
f = @(t, y) [y(2); (5*sin(t/2) + 2*sin(t) + sin(2*t) - c*y(2) - 10*y(1))/10];
```
接着是采用Wilson-θ法进行计算,并绘制时间位移曲线图:
```matlab
% 采用Wilson-θ法进行计算,并绘制时间位移曲线图
[t1, x1] = wilson_theta(f, tspan, [x0, v0], h, theta, c1);
[t2, x2] = wilson_theta(f, tspan, [x0, v0], h, theta, c2);
figure;
subplot(2, 1, 1);
plot(t1, x1(:, 1), 'b', t2, x2(:, 1), 'r');
xlabel('时间');
ylabel('位移');
legend('c = 3', 'c = 20');
title('Wilson-θ法计算位移');
subplot(2, 1, 2);
plot(x1(:, 1), x1(:, 2), 'b', x2(:, 1), x2(:, 2), 'r');
xlabel('位移');
ylabel('速度');
legend('c = 3', 'c = 20');
title('Wilson-θ法计算相空间轨迹');
```
其中采用了一个自定义的Wilson-θ法计算函数`wilson_theta`,其代码如下:
```matlab
function [t, y] = wilson_theta(f, tspan, y0, h, theta, c)
% 采用Wilson-θ法进行数值解
t = tspan(1):h:tspan(2);
y = zeros(length(t), length(y0));
y(1, :) = y0;
for i = 2:length(t)
% 预测
y_pred = y(i-1, :) + h*y(i-1, 2);
% 计算g
g = @(x) y(i-1, :) + h*theta*[y(i-1, 2); (5*sin(t(i-1)/2) + 2*sin(t(i-1)) + sin(2*t(i-1)) - c*y(i-1, 2) - 10*y(i-1, 1))/10] + h*(1-theta)*[y_pred(2); (5*sin(t(i)/2) + 2*sin(t(i)) + sin(2*t(i)) - c*y_pred(2) - 10*y_pred(1))/10] - x';
% Newton迭代求解
x0 = y_pred';
err = inf;
while err > 1e-10
J = [1, -h*(1-theta)*c/10; -h*theta/10, 1-h*(1-theta)*c/10];
x1 = x0 - (J\g(x0))';
err = norm(x1 - x0);
x0 = x1;
end
% 更新y
y(i, :) = x1;
end
end
```
最后,程序会绘制出两幅图,第一幅是时间位移曲线图,第二幅是相空间轨迹图。
阅读全文