MATLAB求解(不使用数据库中函数)常微分方程的数值方法,给定一个常微分方程或常微分方程组,构造求解方程的数值方法,并给出误差分析的代码
时间: 2024-03-13 17:46:42 浏览: 129
基于MATLAB实现插值、微分、积分和求解常微分方程和偏微分方程的数值方法
以下是用MATLAB实现欧拉法、改进的欧拉法和龙格-库塔方法求解一阶常微分方程dy/dx = -y的代码,以及对应的误差分析:
欧拉法:
```
% 定义ODE函数
function dydx = myode(x,y)
dydx = -y;
end
% 定义初始条件
y0 = 1;
% 定义步长和求解范围
h = 0.1;
xspan = [0 5];
% 求解ODE(欧拉法)
x = xspan(1):h:xspan(2);
y = zeros(size(x));
y(1) = y0;
for i = 1:length(x)-1
y(i+1) = y(i) + h*myode(x(i),y(i));
end
% 绘图
plot(x,y)
xlabel('x')
ylabel('y')
% 误差分析
% 欧拉法的截断误差为O(h^2)
h = 0.1;
x = xspan(1):h:xspan(2);
y_exact = exp(-x);
y_euler = zeros(size(x));
y_euler(1) = y0;
for i = 1:length(x)-1
y_euler(i+1) = y_euler(i) + h*myode(x(i),y_euler(i));
end
% 计算误差
error_euler = abs(y_euler - y_exact);
% 绘制误差图像
figure
plot(x,error_euler)
xlabel('x')
ylabel('Error')
```
改进的欧拉法:
```
% 定义ODE函数
function dydx = myode(x,y)
dydx = -y;
end
% 定义初始条件
y0 = 1;
% 定义步长和求解范围
h = 0.1;
xspan = [0 5];
% 求解ODE(改进的欧拉法)
x = xspan(1):h:xspan(2);
y = zeros(size(x));
y(1) = y0;
for i = 1:length(x)-1
k1 = myode(x(i),y(i));
k2 = myode(x(i+1),y(i)+h*k1);
y(i+1) = y(i) + (h/2)*(k1 + k2);
end
% 绘图
plot(x,y)
xlabel('x')
ylabel('y')
% 误差分析
% 改进的欧拉法的截断误差为O(h^3)
h = 0.1;
x = xspan(1):h:xspan(2);
y_exact = exp(-x);
y_heun = zeros(size(x));
y_heun(1) = y0;
for i = 1:length(x)-1
k1 = myode(x(i),y_heun(i));
k2 = myode(x(i+1),y_heun(i)+h*k1);
y_heun(i+1) = y_heun(i) + (h/2)*(k1 + k2);
end
% 计算误差
error_heun = abs(y_heun - y_exact);
% 绘制误差图像
figure
plot(x,error_heun)
xlabel('x')
ylabel('Error')
```
龙格-库塔方法:
```
% 定义ODE函数
function dydx = myode(x,y)
dydx = -y;
end
% 定义初始条件
y0 = 1;
% 定义步长和求解范围
h = 0.1;
xspan = [0 5];
% 求解ODE(龙格-库塔方法)
x = xspan(1):h:xspan(2);
y = zeros(size(x));
y(1) = y0;
for i = 1:length(x)-1
k1 = myode(x(i),y(i));
k2 = myode(x(i)+h/2,y(i)+h*k1/2);
k3 = myode(x(i)+h/2,y(i)+h*k2/2);
k4 = myode(x(i)+h,y(i)+h*k3);
y(i+1) = y(i) + (h/6)*(k1+2*k2+2*k3+k4);
end
% 绘图
plot(x,y)
xlabel('x')
ylabel('y')
% 误差分析
% 龙格-库塔方法的截断误差为O(h^4)
h = 0.1;
x = xspan(1):h:xspan(2);
y_exact = exp(-x);
y_rk4 = zeros(size(x));
y_rk4(1) = y0;
for i = 1:length(x)-1
k1 = myode(x(i),y_rk4(i));
k2 = myode(x(i)+h/2,y_rk4(i)+h*k1/2);
k3 = myode(x(i)+h/2,y_rk4(i)+h*k2/2);
k4 = myode(x(i)+h,y_rk4(i)+h*k3);
y_rk4(i+1) = y_rk4(i) + (h/6)*(k1+2*k2+2*k3+k4);
end
% 计算误差
error_rk4 = abs(y_rk4 - y_exact);
% 绘制误差图像
figure
plot(x,error_rk4)
xlabel('x')
ylabel('Error')
```
以上代码中,首先定义了一阶常微分方程dy/dx = -y的ODE函数myode,然后分别使用欧拉法、改进的欧拉法和龙格-库塔方法求解该常微分方程,并绘制了求解结果的函数曲线图。接着,对每种数值方法进行了误差分析,计算了截断误差,并绘制了误差图像。
阅读全文