【MATLAB】欧拉法、2阶R-K法、4阶R-K法、预测-校正法(M-S法、A-M法)、有限差分法 解常微分方程

2023-10-29 05:30

本文主要是介绍【MATLAB】欧拉法、2阶R-K法、4阶R-K法、预测-校正法(M-S法、A-M法)、有限差分法 解常微分方程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

之一:【MATLAB】逐步搜索法、二分法、比例求根法、牛顿法、弦截法求方程的根

本文为《数值计算方法》的作业之二

之三:

目录

  • 1、欧拉法、2阶R-K法、4阶R-K法
    • 欧拉法与改进的欧拉法(预测-校准系统)
  • 2、使用预测-校正法(M-S法、A-M法)
  • 3、有限差分法
    • 边值为y
    • 边值为y'

1、欧拉法、2阶R-K法、4阶R-K法

1

x=1时解析解:

ans =
解

x=1时解析解约值:

ans = 6.8329

x=1,步长=0.1时欧拉解:

ans = 6.4053

x=1,步长=0.05时欧拉解:

ans = 6.6113

x=1,步长=0.01时欧拉解:

ans = 6.7872

x=1,2阶R-K法解:

ans = 6.8328

x=1,4阶R-K法解:

ans = 6.8329

% 分别使用欧拉法、2阶R-K法、4阶R-K法求解
% 步长分别选为0.10.050.01,并计算x=1时的函数值。对比你的 数值解与解析解
clear
% 解析解
syms y(x)
eqn = diff(y,x) == x * y - 1;
cond = y(0) == 5;
f_analysis = dsolve(eqn,cond);
disp("x=1时解析解:")
subs(f_analysis,1) % 符号变量赋值
disp("x=1时解析解约值:")
eval(subs(f_analysis,1))% 执行文本中的 MATLAB 表达式% 欧拉法
h = 0.1;
[~,f_Euler] = Euler(0, 5, @(x,y)x*y-1, h, 1);
disp("x=1,步长=0.1时欧拉解:")
f_Euler(end)
h = 0.05;
[~,f_Euler] = Euler(0, 5, @(x,y)x*y-1, h, 1);
disp("x=1,步长=0.05时欧拉解:")
f_Euler(end)
h = 0.01;
[~,f_Euler] = Euler(0, 5, @(x,y)x*y-1, h, 1);
disp("x=1,步长=0.01时欧拉解:")
f_Euler(end)% ode23    解非刚性微分方程,低精度,使用Runge-Kutta法的二三阶算法。
[~,y_RK2] = ode23(@(x,y) x * y - 1, [0 1], 5);
disp("x=1,2阶R-K法解:")
y_RK2(end)% ode45    解非刚性微分方程,中等精度,使用Runge-Kutta法的四五阶算法。
[x,y_RK4] = ode45(@(x,y) x * y - 1, [0 1], 5);
disp("x=1,4阶R-K法解:")
y_RK4(end)function [x, y] = Euler(x0, y0, f, h, x_right)
l = length(x0:h:x_right);
x = zeros(l,1);
y = zeros(l,1);
x(1) = x0;
y(1) = y0;for i = 1:(l-1)x(i + 1) = x(i) + h;y(i + 1) = y(i) + h * f(x(i),y(i));end
end

欧拉法与改进的欧拉法(预测-校准系统)

参考来源:《数值计算方法》第二版 高等教育出版社 2010第13次印刷(ISBN 978-7-04-012800-0) P97~101

clearf = @(x,y) 1 ./(1+x^2) - 2.*y.^2
% 欧拉法h = 0.1;[x,f_Euler] = Euler(0, 0, @(x,y)f(x,y), h, 1);disp("x=1,步长=0.1时欧拉解:")f_Euler'
plot(x,f_Euler)
hold on
% 改进的欧拉法h = 0.1;[x,f_Euler] = Euler2(0, 0, @(x,y)f(x,y), h, 1);disp("x=1,步长=0.1时改进欧拉解:")f_Euler'
plot(x,f_Euler)hold offfunction [x, y] = Euler(x0, y0, f, h, x_right)% 欧拉格式l = length(x0:h:x_right);x = zeros(l,1);y = zeros(l,1);x(1) = x0;y(1) = y0;    for i = 1:(l-1)        x(i + 1) = x(i) + h;        y(i + 1) = y(i) + h * f(x(i),y(i));    endend
function [x, y] = Euler2(x0, y0, f, h, x_right)% 改进的欧拉格式 预测-校准系统l = length(x0:h:x_right);x = zeros(l,1);y = zeros(l,1);x(1) = x0;y(1) = y0;    for i = 1:(l-1)        x(i + 1) = x(i) + h;        y_ = y(i) + h * f(x(i),y(i));% 预报        y(i + 1) = y(i) + h./2 .* (f(x(i),y(i)) + f(x(i),y_));% 矫正    endend

2、使用预测-校正法(M-S法、A-M法)

2

  • M-S法结果:
ans = 1.8156e+16
  • A-M法结果:
ans = 5.2682e+15
  • 代码:

此部分代码部分参考 https://zhuanlan.zhihu.com/p/114288291

sys = MilneSimpson()
sys(end,2)
sys = AdamsMoulton()
sys(end,2)function sys=MilneSimpson()% MilneSimpson线性多步法求解常微分方程clear,clc,close allx1=0;x2=5;h=0.1;N=abs(x2-x1)/h; y=zeros(N+1,1);x=zeros(N+1,1);y(1)=5;[~,y_RK4] = ode45(@(x,y) fx(x,y), [x1 x1+h], y(1));y(2)=y_RK4(end);[~,y_RK4] = ode45(@(x,y) fx(x,y), [x1 x1+2*h], y(1));y(3)=y_RK4(end);[~,y_RK4] = ode45(@(x,y) fx(x,y), [x1 x1+3*h], y(1));y(4)=y_RK4(end);x(1)=x1;for i=1: Nx(i+1)=x1+i*h;if(i>=4)y(i+1)=y(i-3)+4*h/3*(2*fx(x(i),y(i))-fx(x(i-1),y(i-1))+2*fx(x(i-2),y(i-2)));endendsys(:,1)=x;sys(:,2)=y;draw(x,y)
endfunction sys=AdamsMoulton()% Adams-Moulton线性多步法求解常微分方程clear,clc,close allx1=0;x2=5;h=0.1;N=abs(x2-x1)/h; y=zeros(N+1,1);x=zeros(N+1,1);y(1)=5;[~,y_RK4] = ode45(@(x,y) fx(x,y), [x1 x1+h], y(1));y(2)=y_RK4(end);[~,y_RK4] = ode45(@(x,y) fx(x,y), [x1 x1+2*h], y(1));y(3)=y_RK4(end);[~,y_RK4] = ode45(@(x,y) fx(x,y), [x1 x1+3*h], y(1));y(4)=y_RK4(end);x(1)=x1;for i=1: Nx(i+1)=x1+i*h;if(i>=4)y(i+1)=y(i)+ h/24*(55*fx( x(i),y(i) )-59*fx( x(i-1) ,y(i-1)) +37*fx( x(i-2) ,y(i-2)) -9*fx( x(i-3) ,y(i-3)));endendsys(:,1)=x;sys(:,2)=y;draw(x,y)
endfunction sys=fx(x, y)sys=x.^2.*y-x;
endfunction draw(x,y)plot(x, y, '.-' )xlabel('X')ylabel('Y')
end

3、有限差分法

边值为y

3.1

2.1

% 有限差分法finite difference method
clear
% 1 边值为y
% y'' + P(x)y' + Q(x)y = R(x)
P = @(x)(0);
Q = @(x)(-2*(9*x+2));
R = @(x)(-2*(9*x+2) * exp(x));
n = 100;
x_0 = 0;
x_n = 1;
y_x_0 = 0;
y_x_n = 1;
h = (x_n-x_0)/n;
x = x_0+h:h:x_n;%Ax = B
A = zeros(n-1,n-1);
B = zeros(n-1,1);
for i = 1:(n-1)B(i) = h .^ 2 * R(x(i));if(i == 1)B(1) = B(1) - (1-h/2*P(x(i)))*y_x_0;A(1,1:2) = [h.^2*Q(x(i))-2 , (1+h/2*P(x(i)))];elseif(i == n-1)B(i) = B(i) - (1+h/2*P(x(i)))*y_x_n;A(i,end-1:end) = [(1-h/2*P(x(i))) , h.^2*Q(x(i))-2];elseA(i,i-1:i-1+2) = [(1-h/2*P(x(i))) , h.^2*Q(x(i))-2 , (1+h/2*P(x(i)))];end
endy = [y_x_0;A\B;y_x_n];
xx = [x_0,x]';
plot(xx,y,'.-')

边值为y’

3.2

3.2

% 2 边值为y'
clear
% y'' + P(x)y' + Q(x)y = R(x)
P = @(x)(0);
Q = @(x)(-4);
R = @(x)(0);
n = 100;
x_0 = 0;
x_n = 1;
dy_x_0 = 2.350;
dy_x_n = 20.036;
h = (x_n-x_0)/n;
x = x_0-h:h:x_n+h;%Ax = B 
A = zeros(n+3,n+3);
B = zeros(n+3,1);
for i = 1:(n+3)if(i == 1)B(1) = dy_x_0 * 2 * h;A(1,1:3) = [-1 0 1];elseif(i == n+3)B(i) = dy_x_n * 2 * h;A(i,end-2:end) = [-1 0 1];elseB(i) = h .^ 2 * R(x(i));A(i,i-1:i-1+2) = [(1-h/2*P(x(i))) , h.^2*Q(x(i))-2 , (1+h/2*P(x(i)))];end
endy = A\B;
xx = x';
plot(xx,y,'.-')

这篇关于【MATLAB】欧拉法、2阶R-K法、4阶R-K法、预测-校正法(M-S法、A-M法)、有限差分法 解常微分方程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/298540

相关文章

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

libsvm在matlab中的使用方法

原文地址:libsvm在matlab中的使用方法 作者: lwenqu_8lbsk 前段时间,gyp326曾在论坛里问libsvm如何在matlab中使用,我还奇怪,认为libsvm是C的程序,应该不能。没想到今天又有人问道,难道matlab真的能运行libsvm。我到官方网站看了下,原来,真的提供了matlab的使用接口。 接口下载在: http://www.csie.ntu.edu.

欧拉系统 kernel 升级、降级

系统版本  cat  /etc/os-release  NAME="openEuler"VERSION="22.03 (LTS-SP1)"ID="openEuler"VERSION_ID="22.03"PRETTY_NAME="openEuler 22.03 (LTS-SP1)"ANSI_COLOR="0;31" 系统初始 kernel 版本 5.10.0-136.12.0.

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数_matlab pmsm-CSDN博客

MATLAB层次聚类分析法

转自:http://blog.163.com/lxg_1123@126/blog/static/74841406201022774051963/ 层次聚类是基于距离的聚类方法,MATLAB中通过pdist、linkage、dendrogram、cluster等函数来完成。层次聚类的过程可以分这么几步: (1) 确定对象(实际上就是数据集中的每个数据点)之间的相似性,实际上就是定义一个表征

MATLAB的fix(),floor()和ceil()函数的区别与联系

fix(x),floor(x)和ceil(x)函数都是对x取整,只不过取整方向不同而已。 这里的方向是以x轴作为横坐标来看的,向右就是朝着正轴方向,向左就是朝着负轴方向。 fix(x):向0取整(也可以理解为向中间取整) floor(x):向左取整 ceil(x):向右取整 举例: 4个数:a=3.3、b=3.7、c=-3.3、d=-3.7 fix(a)=3 fl

MATLAB中的eig函数

在MATLAB中,计算矩阵A的特征值和特征向量的函数是eig(A),常用的调用格式有5种: E=eig(A):求矩阵A的全部特征值,构成向量E。 [V,D]=eig(A):求矩阵A的全部特征值,构成对角阵D,并求A的特征向量构成V的列向量。 [V,D]=eig(A,'nobalance'):与第2种格式类似,但第2种格式中先对A作相似变换后求矩阵A的特征值和特征向量,而格式3直接求矩阵A的特