首页/文章/ 详情

Python方程组获取雅克比矩阵和海塞矩阵

2年前浏览2209

前面讲过当我们处理一个常微分方程组(一般对应于一个物理系统的求解)的时候,可以直接采用matlab中的ode函数比如ode15s和ode45,python的scipy中也有对应的函数像odeint和odebvp。但是,如果你想硬刚,自己去实现这些东西的话你就需要造很多的轮子,这里给出一个可以根据你输入的代数方程组获取雅克比矩阵和海塞矩阵的函数,并且我还特地将他做成了一个类哦,你可以直接进行实例化然后调用,非常方便,而且我还给出了测试函数。特别适合想硬刚底层算法的铁子。

主要的核心就是给出sympy中方程组的定义,以及sympy中将符号转化为可以计算的表达式的方式

# -*- coding: utf-8 -*-"""Created on 2022/1/25 10:45@Author: 123@Email: 985040320@qq.com@Describe: **加入文件描述, 要实现的功能, 注意事项等**"""class j_h_m:

    def __init__(self, funcs, vars):
        self.funcs = funcs
        self.vars = vars
        self.jac_m = sy.zeros(len(vars), len(vars))
        self.His_m = sy.zeros(len(vars), len(vars))

    # 获取雅克比矩阵
    def Ja(self):
        self.jac_m = self.funcs.jacobian(self.vars)
        return self.jac_m

    # 获取海塞矩阵
    def His(self):
        for i, fi in enumerate(self.funcs):
            for j, r in enumerate(self.vars):
                for k, s in enumerate(self.vars):
                    self.His_m[k, j] = sy.diff(sy.diff(fi, r), s)
        return self.His_mif __name__ == "__main__":
    import sympy as sy

    # 符号化
    vdot1, vdot2, y1, y2 = sy.symbols("vdot1, vdot2, y1, y2")
    # 构建方程组
    vdot1 = y2
    vdot2 = 1000 * (1 - y1 ** 2) * y2 - y1
    # 封装成sympy的符号矩阵
    funcs = sy.Matrix([vdot1, vdot2])
    args = sy.Matrix([y1, y2])
    # 实例化类并计算雅克比矩阵
    h = j_h_m(funcs, args)
    jac = h.Ja()
    his = h.His()
    # 将sympy的符号转化为函数表达式
    f = sy.lambdify([y1, y2], his, 'numpy')  # 通过这段话转化为可以计算的函数表达式
    print(jac)
    print(his)
燃料电池MEMS
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2022-02-21
最近编辑:2年前
蘑菇
硕士 | 工程师 签名征集中
获赞 102粉丝 117文章 15课程 11
点赞
收藏
未登录
还没有评论

课程
培训
服务
行家

VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈