[0424学习]数值积分代码实现

"本文探讨了传统for循环积分方法的效率问题,通过矩阵运算方式重定义二重积分,减少计算复杂度。介绍如何处理异常值,利用repmat生成矩阵并根据不同情况调整区间间隔,从而在短时间内获得更精确的结果,提高计算速度和精度。"
摘要由CSDN通过智能技术生成

1.原始方法为写多层for循环,几次积分就有几层for,但是这样的话会导致运行代码的速度太慢,效率太低,以双重积分为例→

两层均为500个区间,则程序需要积分半天左右,且误差很大,改变上下限会对结果影响很大。

2.改变算法,利用矩阵运算:

  1. 以二重积分为例,积分变量为两个,可以用两个矩阵将两个变量可能的取值存起来。算法:
  2. 积分前提:外层积分x,linspace的区间数为m+1;里层积分y,linspace区间数为n+1
  3. 分支条件1:x、y的积分区间中,xmin or xmax or ymin or ymax在计算过程中会使被积函数产生异常值,如nan\inf。因此将linspace生成的向量,每两个相邻元素相加后/2,取中间值,则x的区间数变为m个,y的区间数变为n个。
  4. 参数矩阵:
  • 设x经上述生成的积分范围行向量为x0,y为y0,则

x_{0}=[x_{1},x_{2},...,x_{m}]

y_{0}=[y_{1},y_{2},...,y_{n}]

  •  x0转置成列向量(m*1)后,用repmat生成每列都为x0,共n列的矩阵X

X=\begin{bmatrix} x_{1} &x_{1} &... &x_{1} \\ x_{2} &x_{2} &... &x_{2} \\ \vdots &\vdots &\vdots &\vdots \\ x_{m} &x_{m} &... &x_{m} \end{bmatrix}_{m\times n}

区间间隔:\left | X(1,1)-X(2,1) \right |

  • y0生成每行都为y0,共m行的矩阵Y。若y0的元素会因x的值而变化(即y的积分范围与x取值有关,会因x变化),则使用m次linspace生成m个对应的y0行向量,组成Y阵即可:

(1)y0与x无关:

Y=\begin{bmatrix} y_{1} &y_{2} &... &y_{n} \\ y_{1} &y_{2} &... &y_{n} \\ \vdots &\vdots &\vdots &\vdots \\ y_{1} &y_{2} &... &y_{n} \end{bmatrix}_{m\times n}

区间间隔:\left | Y(1,1)-Y(1,2) \right |

(2)y0与x有关:x_{i} 对应的y行向量为y_{ij}

Y=\begin{bmatrix} y_{11} &y_{12} &... &y_{1n} \\ y_{21} &y_{22} &... &y_{2n} \\ \vdots &\vdots &\vdots &\vdots \\ y_{m1} &y_{m2} &... &y_{mn} \end{bmatrix}_{m\times n}

即第一行为x1对应的y积分范围,第二行为x2对应的y积分范围。

区间间隔:\left | Y(i,1)-Y(i,2) \right | ,注意是会变化的

5.后续计算中都要使用支持矢量运算的函数。输出的被积函数的值第i行j列数值即为(xi,yj)对应的取值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值