计算物理专题:高维Romberg数值积分方法

news2024/9/21 4:29:33
  • 有话无话,先上代码,正确与否,先给结论,可信有无,先出文献
  • 计算物理,傅哥最强
    • 真计算还得看SCU物拔(不是)(狗头)(骄傲)
  • 这种方法的思想是利用插值公式来构造高精度的积分公式,然后用递归的方式来增加精度。它的主要优点是精度高,收敛迅速,并且非常适合计算高维积分。
    • 接着,我们将这些子区间合并成更大的区间,然后在这些区间上再次构造级别为 $k+1$ 的高精度插值公式,计算出积分值。通过递归的方式,我们可以得到不同级别的积分值。最终,将这些积分值代入级别最高的插值公式中,就可以得到所求积分的高精度近似值。

示例代码

  • 十一维数值积分
  • 友情提示:不要运行哦,你的笔记本算不出来的。。。。。
    • 这个和博主的编码能力无关,就是算不出来,不要杠,杠你就输了
    • 这个是随机内存的问题,高维积分方法不能出这个问题
def f(x,y,z,w,u,v,i,o,p,k,l):
    return x**2 + y**2 + z**2 +\
           w**2 + u**2 + v**2 +\
           i**2 + o**2 + p**2 +\
           k**2 + l**2
    


def romberg_11d(f,x1,x2,y1,y2,z1,z2,\
                 w1,w2,u1,u2,v1,v2,\
                 i1,i2,o1,o2,p1,p2,\
                 k1,k2,l1,l2,\
                 eps=1e-6,n=50):

    def trapezoid(f,a,b,n):
        h = (b - a) / float(n)
        s = 0.5*(f(a) + f(b))
        for i in range(1, n):
            s += f(a + i*h)
        return h*s
    
    def romberg(f,a,b,eps=1e-6,n=50):
        R = [[0]*(n+1) for i in range(n+1)]
        for i in range(1, n+1):
            h = float(b-a)/(2**i)
            R[i][1] = trapezoid(f, a, b, 2**(i-1))
            for j in range(2, i+1):
                R[i][j] = (4**(j-1)*R[i][j-1]-R[i-1][j-1])/(4**(j-1)-1)
            if abs(R[i][i]-R[i-1][i-1]) < eps:
                return R[i][i]
        raise ValueError('romberg integration failed to converge')

    def integrand_l(x,y,z,w,u,v,i,o,p,k):
        return romberg(lambda l:f(x,y,z,w,u,v,i,o,p,k,l),l1,l2,eps,n)

    def integrand_k(x,y,z,w,u,v,i,o,p):
        return romberg(lambda k:integrand_l(x,y,z,w,u,v,i,o,p,k),k1,k2,eps,n)

    def integrand_p(x,y,z,w,u,v,i,o):
        return romberg(lambda p:integrand_k(x,y,z,w,u,v,i,o,p),p1,p2,eps,n)

    def integrand_o(x,y,z,w,u,v,i):
        return romberg(lambda o:integrand_p(x,y,z,w,u,v,i,o),o1,o2,eps,n)

    def integrand_i(x,y,z,w,u,v):
        return romberg(lambda i:integrand_o(x,y,z,w,u,v,i),i1,i2,eps,n)
    
    def integrand_v(x,y,z,w,u):
        return romberg(lambda v:integrand_i(x,y,z,w,u,v),v1,v2,eps,n)

    def integrand_u(x,y,z,w):
        return romberg(lambda u:integrand_v(x,y,z,w,u),u1,u2,eps,n)

    def integrand_w(x,y,z):
        return romberg(lambda w:integrand_u(x,y,z,w),w1,w2,eps,n)

    def integrand_z(x,y):
        return romberg(lambda z:integrand_w(x,y,z),z1,z2,eps,n)

    def integrand_y(x):
        return romberg(lambda y:integrand_z(x,y),y1,y2,eps,n)

    return romberg(lambda x:integrand_y(x),x1,x2,eps,n)

#x,y,z,w,u,v,i,o,p,k,l
result = romberg_11d(f,-1,1,-1,1,-1,1,\
                       -1,1,-1,1,-1,1,\
                       -1,1,-1,1,-1,1,\
                       -1,1,-1,1)
print(result)
  • 四维积分代码

def f(x,y,z,w):
    return x**2 + y**2 + z**2 + w**2
    


def romberg_4d(f,x1,x2,y1,y2,z1,z2,w1,w2,eps=1e-6,n=50):

    def trapezoid(f,a,b,n):
        h = (b - a) / float(n)
        s = 0.5*(f(a) + f(b))
        for i in range(1, n):
            s += f(a + i*h)
        return h*s
    
    def romberg(f,a,b,eps=1e-6,n=50):
        R = [[0]*(n+1) for i in range(n+1)]
        for i in range(1, n+1):
            h = float(b-a)/(2**i)
            R[i][1] = trapezoid(f, a, b, 2**(i-1))
            for j in range(2, i+1):
                R[i][j] = (4**(j-1)*R[i][j-1]-R[i-1][j-1])/(4**(j-1)-1)
            if abs(R[i][i]-R[i-1][i-1]) < eps:
                return R[i][i]
        raise ValueError('romberg integration failed to converge')

    def integrand_w(x,y,z):
        return romberg(lambda w:f(x,y,z,w),w1,w2,eps,n)
    def integrand_z(x,y):
        return romberg(lambda z:integrand_w(x,y,z),z1,z2,eps,n)
    def integrand_y(x):
        return romberg(lambda y:integrand_z(x,y),y1,y2,eps,n)


    return romberg(lambda x:integrand_y(x),x1,x2,eps,n)


result = romberg_4d(f,-1,1,-1,1,-1,1,-1,1)
print(result)
  • result

============= RESTART: 四重Romberg.py =============
21.333333333333332
>>> 

Romberg数值积分原理

  • 微积分基本定理(Newton Leibniz)
  • 机械求积法
  • 插值型求积
  • 梯形公式
  • 等距节点的N-C公式
  • 辛普森公式
  • 复合求积公式
  • 高斯求积公式

哈哈,刚才列出来的,全部不用记住,因为根本记不下来,考试前背一下就ok,至于工作的时候,你不会查手册吗????

蒙特卡洛模拟替代

  • 蒙特卡洛方法的优势在于它具有很强的适应性和灵活性,能够用于求解一些非常复杂的问题。与其他数值计算方法相比,蒙特卡洛方法不需要求解解析解,因此能够处理一些难以求解的问题,并且不会受到算法复杂度的限制。此外,蒙特卡洛方法可以直接利用随机抽样技术来求解问题,因此具有很好的并行计算能力,能够利用大规模计算资源来加速计算。
  • 很好,那我们举一个例子吧
  • 计算高维空间中球的体积:

import numpy as np
import scipy.special as spi
import matplotlib.pyplot as plt
np.random.seed(0)
import time


def prod(n):
    p = 1
    for i in range(1,n+1):
        p *= i
    return p

def f(n):
    if n%2==0:
        k = int(n/2)
        return np.pi**(k)/prod(k)
    elif n%2==1:
        k = int((n-1)/2)
        return np.pi**k*prod(k)*2**n/prod(n)

def main(Num=1e5,dim=4):
    assert(dim>=2),"dim should greater than 2!!!"
    Sum = 0
    #start = time.time()
    for i in range(int(Num)): 
        x = np.random.random(dim)
        p = sum(x**2)
        if p<=1:
            Sum += 1
    #end = time.time()
    #print("Used:",end-start)
    #print("Volume:",Sum/Num*(2**dim))
    #print("Theory:",f(dim))
    return Sum/Num*(2**dim),f(dim)

Dim = [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
V = [0 for i in range(len(Dim))]
F = [0 for i in range(len(Dim))]

for i in range(len(Dim)):
    V[i],F[i] = main(dim=Dim[i])
plt.scatter(range(len(Dim)),V,c="red")
plt.scatter(range(len(Dim)),F,c="blue")
plt.plot(range(len(Dim)),V,c="red",label="volume")
plt.plot(range(len(Dim)),F,c="blue",label="Theory")
plt.legend()
plt.pause(0.01)
  •  显然这个精度可能不太够,因此我们需要提高抽样的数量至1e6
    • 事实上,依然是不够的,你的笔记本性能 ,数学能力,编程能力是一个不可能三角(针对有限的大学课程而言)

梯形法:四重积分为例

  • 蒙特卡洛方法可能不能满足许多数学推导爱好者的想法,那我们用梯形法实现一下
import numpy as np

def f(x1, x2, x3, x4):
    return x1+x2+x3+x4
    
def trapezoid_integration(f, a1, b1, a2, b2, a3, b3, a4, b4, n1, n2, n3, n4):
    h1 = (b1 - a1) / n1
    h2 = (b2 - a2) / n2
    h3 = (b3 - a3) / n3
    h4 = (b4 - a4) / n4

    x1 = np.linspace(a1, b1, n1+1)
    x2 = np.linspace(a2, b2, n2+1)
    x3 = np.linspace(a3, b3, n3+1)
    x4 = np.linspace(a4, b4, n4+1)

    integral = 0
    for i in range(n1):
        for j in range(n2):
            for k in range(n3):
                for l in range(n4):
                    integral += (f(x1[i], x2[j], x3[k], x4[l]) + f(x1[i+1], x2[j], x3[k], x4[l]) +
                                f(x1[i], x2[j+1], x3[k], x4[l]) + f(x1[i+1], x2[j+1], x3[k], x4[l]) +
                                f(x1[i], x2[j], x3[k+1], x4[l]) + f(x1[i+1], x2[j], x3[k+1], x4[l]) +
                                f(x1[i], x2[j+1], x3[k+1], x4[l]) + f(x1[i+1], x2[j+1], x3[k+1], x4[l]) +
                                f(x1[i], x2[j], x3[k], x4[l+1]) + f(x1[i+1], x2[j], x3[k], x4[l+1]) +
                                f(x1[i], x2[j+1], x3[k], x4[l+1]) + f(x1[i+1], x2[j+1], x3[k], x4[l+1]) +
                                f(x1[i], x2[j], x3[k+1], x4[l+1]) + f(x1[i+1], x2[j], x3[k+1], x4[l+1]) +
                                f(x1[i], x2[j+1], x3[k+1], x4[l+1]) + f(x1[i+1], x2[j+1], x3[k+1], x4[l+1])) / 16 * h1 * h2 * h3 * h4

    return integral

a1, b1, n1 = 0, 1, 10
a2, b2, n2 = 0, 1, 10
a3, b3, n3 = 0, 1, 10
a4, b4, n4 = 0, 1, 10
integral = trapezoid_integration(f, a1, b1, a2, b2, a3, b3, a4, b4, n1, n2, n3, n4)

print("INTEGER:", integral)

INTEGER: 2.0000000000000275

现代方法

  • 不用想,计算软件不可能这么处理高维积分
    • 数值分析这么多年不可能没有发展出点别的神话操作
    • 抽象代数也不是白学的
  • 列出一些参考文献
    • 徐利治,周蕴时.高维数值积分 [M]. 北京:科学出版社, 1980
    • 柯召,孙琦.数论讲义 [M]. 北京:高等教育出版社, 200 1.
    • 吕涛,石济民,林振宝.分裂外推与组合技巧 [M]. 北京:科学出版社, 1988.
       

  • 讨论加QQ:3052408134 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/536333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Springboot +Flowable,会签、或签简单使用(三)

一.简介 **会签&#xff1a;**在一个流程中的某一个 Task 上&#xff0c;这个 Task 需要多个用户审批&#xff0c;当多个用户全部审批通过&#xff0c;或者多个用户中的某几个用户审批通过&#xff0c;就算通过。 例如&#xff1a;之前的请假流程&#xff0c;假设这个请假流程…

【笔试强训选择题】Day15.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01; 文章目录 前言 一、…

Linux Shell 实现一键部署二进制Python

python 前言 Python由荷兰数学和计算机科学研究学会的吉多范罗苏姆于1990年代初设计&#xff0c;作为一门叫做ABC语言的替代品。 Python提供了高效的高级数据结构&#xff0c;还能简单有效地面向对象编程。Python语法和动态类型&#xff0c;以及解释型语言的本质&#xff0c;使…

监控知识体系

从来没讲过运维&#xff0c;因为我觉得运维这种东西不需要太多的知识面&#xff0c;然后我一个做了运维朋友告诉我大错特错&#xff0c;他就是从3K的运维一步步到40K的&#xff0c;甚至笑着说&#xff1a;我现在感觉自己什么都能做。 既然讲&#xff0c;就讲最重要的吧。 监控…

接口自动化测试分层设计与实践总结

本文以笔者当前使用的自动化测试项目为例&#xff0c;浅谈分层设计的思路&#xff0c;不涉及到具体的代码细节和某个框架的实现原理&#xff0c;重点关注在分层前后的使用对比&#xff0c;可能会以一些伪代码为例来说明举例。 接口测试三要素&#xff1a; 参数构造 发起请求&a…

NA、商业和分销市场通盘布局,华为“四大角色”浮出水面

作者 | 曾响铃 文 | 响铃说 数字经济深化发展&#xff0c;谋求数字化转型的行业、企业客户&#xff0c;越来越渴望满足自身需求的产品或解决方案。 这给从事转型服务的ICT厂商们提出了新的挑战。 在客户面前&#xff0c;拥有核心技术与支持能力的企业&#xff0c;与进击数字…

yolov1

1、对precision&#xff08;精确度&#xff09;和recall&#xff08;召回度&#xff09;的理解 1、TP TN FP FN的概念 TP&#xff08;True Positives&#xff09;意思就是被分为了正样本&#xff0c;而且分对了。 TN&#xff08;True Negatives&#xff09;意思就是被分为了负…

原装美国Agilent安捷伦34970A数据采集仪

Agilent安捷伦34970A数据采集仪 3槽主机&#xff0c;内置GPIB和RS232接口 6 1/2 位&#xff08;22 位&#xff09;内部 DMM&#xff0c;每秒扫描多达 250 个通道&#xff08;选件 001 不可用&#xff09; 8个开关和控制插件模块可供选择 内置信号调理可测量热电偶、RTD 和热敏电…

linux基础(IO)中

目录&#xff1a; 1.回顾上一篇的文件系统调用接口 2.返回值文件描述符 3.文件描述符分配规则 ---------------------------------------------------------------------------------------------------------------------------- 1.回顾上一篇的文件系统调用接口 open &…

【数据结构】二叉树进阶题目练习

文章目录 二叉树创建字符串二叉树的分层遍历1二叉树的分层遍历2给定一个二叉树, 找到该树中两个指定节点的最近公共祖先二叉树搜索树转换成排序双向链表二叉树展开为链表根据一棵树的前序遍历与中序遍历构造二叉树根据一棵树的中序遍历与后序遍历构造二叉树二叉树的前序遍历 非…

学爬虫,吃牢饭,卑微前端小丑复制antd的icon图标真的太难啦,我用python几秒扒完

目标需求 最近用reactviteantd写了个后管项目&#xff0c;在菜单管理中&#xff0c;需要用户选择菜单的icon图标。 如下&#xff1a; 而在react中使用antd UI库&#xff0c;每个组件都是需要单独导入的&#xff0c;也就是说&#xff0c;如果我要用到所有icon&#xff0c;我需…

亚马逊云科技进一步加快BMW Group的Analytics步伐

BMW Group和亚马逊云科技于2020年宣布达成全面战略合作。本次合作的目标是通过将数据分析置于决策中心&#xff0c;进一步加快BMW Group的创新步伐。本次合作的一个关键要素是进一步开发BMW Group的云数据中心&#xff08;CDH&#xff09;。这是在云端管理全公司数据和数据解决…

windows_exporter 部署

目录 - 配置服务- 配置prometheus - 配置服务 下载地址&#xff1a; https://github.com/prometheus-community/windows_exporter/releases 从github上下载windows_exporter.msi&#xff08;我下载的是windows_exporter-0.22.0-amd64.msi&#xff09;cmd命令&#xff1a;msie…

对 API 中敏感数据检测,用这个插件就好了

Postcat 中的 openDLP 插件基于 openDLP 开源项目&#xff0c;针对 Postcat 场景实现了敏感 API 发现功能&#xff0c;通过扫描 API 文档&#xff0c;识别该 API 是否可能是一个涉及敏感数据的 API。 目前内置支持 17 类敏感数据类型&#xff0c;可以通过自定义正则支持更多类型…

2023年安全岗秋招经验分享,纯干货,建议收藏!

需要准备的几个方向 简历自我介绍计算机网络操作系统&#xff08;操作系统原理&#xff0c;Linux&#xff0c;Windows&#xff09;数据库算法&#xff08;Leetcode&#xff09;编程语言&#xff08;Python,C,go等&#xff09;安全知识&#xff08;很多很杂&#xff0c;建议根据…

python3 爬虫相关学习3:response= requests.get(url)的各种属性

目录 1 requests.get(url) 的各种属性&#xff0c;也就是response的各种属性 2 下面进行测试 2.1 response.text 1.2 response.content.decode() 1.2.1 response.content.decode() 或者 response.content.decode("utf-8") 1.2.2 response.content.decode(…

实验室信息管理系统源码,LIS系统源码

云LIS系统是医院信息管理的重要组成部分之一&#xff0c;系统集申请、采样、核收、计费、检验、审核、发布、质控、查询、耗材控制等检验科工作为一体的网络管理系统。LIS系统不仅是自动接收检验数据&#xff0c;打印检验报告&#xff0c;系统保存检验信息的工具&#xff0c;而…

平抑风电波动的电-氢混合储能容量优化配置(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

22届硕士,去年秋招拿了字节跳动offer,有一说一,不是很难进

自从抖音短视频APP火了之后&#xff0c;起公司字节跳动也逐渐向着大厂靠拢&#xff0c;相信大家都已经对这家公司很熟悉了&#xff0c;尤其是近几年来&#xff0c;对它的认识也在不断刷新&#xff0c;它惊人的发展速度确实让行业内人刮目相看&#xff0c;如今很多年轻人也想要挤…

【工作记录】springsecurity从入门到实战(一)

一、介绍 在web应用开发中&#xff0c;安全无疑是十分重要的&#xff0c;目前最流行的安全框架莫过于shiro和springsecurity了。 以下是二者简单的一个对比: SpringSecurityShiro基本功能完善完善文档完善程度强大强大社区支持度依托于Spring&#xff0c;社区支持强大强大集…