含有隐函数的离散常微分方程求解

  前段时间代码中碰到一个含有隐函数的离散常微分方程的求解问题,在这里和大家讨论一下其求解方法。
  首先,介绍一下什么是常微分方程。微分方程求解问题在大学高等数学中学过,当我碰到这个问题后,我还专门去翻了一下高数的书(都还给老师了ORZ)。微分方程的定义是:凡含有参数,未知函数和未知函数导数 (或微分) 的方程,称为微分方程。而常微分方程是指未知函数是一元函数的微分方程。
  下面是一个简单的常微分方程:
  这里写图片描述
  上式中,f(x)和g(x)都是x的显式函数,a是常数,解上边的微分方程可以得到f(x)的函数表达式。对于连续的情况,即:f(x)和g(x)都是连续函数,我们在大一大二学的微积分或者高数书上都有详细的求解方法。例如:可采用常数变易法,通过常数变易法,可求出一阶线性微分方程的通解。带入初值即可求出其特解。
  常徽分方程是研究自然科学社会科学中的事物运动和变化规律的最基本的数学理论及方法自然界中很多事物的运动规律,如牛顿运动定律,万有引力定律等, 社会科学中很多现象的演变规律如人口发展规律市场均衡价格的变化等 都可用常徽分方程来描述。但是我们在工程中遇到的常微分方程往往不是我们学过的理想形式,下边就分析我遇到的一种情况:
  g(x)是采集的离散值,不知道函数形式,是一个隐函数,总结一下就是:g(x)是隐函数的离散形式的常微分方程求解。对于这个问题,我认为可以用前向欧拉、函数拟合或者构造优化求解模型,利用优化方法进行求解。我这里介绍利用欧拉法和函数拟合的方法求解这个常微分方程。

1.利用欧拉法求解含有隐函数的微分方程

  这个方法思路非常简单,就是利用差分方程代替微分方程。得到f(x)的每个采样点的值。
  欧拉
  通过上式我们可以得到f(x)在每个点的值。在程序数据处理中,我们得到f(x)的所有值就足够了。下边我用matlab对此方法进行了仿真:

%% ********用欧拉的方式求解ode *******%%
%%
clc;
clear all;
close all;
%% 定义构造函数参量
func1 = @(x)sin(2*pi*x)+cos(2*pi*x);   
func2 = @(x)3*x+1;
func3 = @(x)x.*x+1;
f1_init = func1(0);           %设置初始点
f2_init = func2(0);
f3_init = func3(0);
constant_A = 2;               %微分方程常系数
sampling_step = 0.01;         %采样间隔
% sampling_step = 1;          %采样间隔
% samp_max = 100;
samp_max = 10;
samp_min = 0;
samp_num = (samp_max-samp_min)/sampling_step;
sampling_x = linspace(samp_min,samp_max,samp_num);
%% 通过构造函数获得恒解空间
% func1_diff = diff(func1,'x');
% func2_diff = diff(func2,'x');
% func3_diff = diff(func3,'x');
func1_diff = @(x)2*pi*cos(2*pi*x)-2*pi*sin(2*pi*x);
func2_diff = @(x)3;
func3_diff = @(x)2*x;
for i=1:samp_num
    g1_fun(i) = func1(sampling_x(i))+constant_
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值