精华内容
下载资源
问答
  • 对数值怎么算
    千次阅读
    2020-11-28 11:32:30

    数值类型

    python的数值类型包括常规的类型:整数(没有小数部分的数字)、浮点数(通俗地说,就是有小数部分的数字)以及其它数值类型(复数、分数、有理数、无理数、集合、进制数等)。除了十进制整数,还有二进制数、八进制数、十六进制数。

    类型 示例

    ---------------------------------------

    整数 1234, -24, 0

    浮点数 1.23, 1., .2, 3.14e-10

    八进制 0o177, 0O177

    十六进制 0x9ff, 0X9ff

    二进制 0b1010, 0B1010

    需要说明的几点事项:

    python 3.x中的整数不区分一般整数和长整型整数,3.x版本中的整数支持无穷精度

    任何时候浮点数都是不精确的。当带有小数点或科学计数的标记符号e或E,就表示这是浮点数

    当浮点数参与表达式的运算时,会以浮点数的规则进行运算,也就是整数会转换成浮点数类型

    python中的浮点数精度和C语言的双精度浮点数精度相同

    整数除了十进制整数外,还可以写成二进制、八进制、十六进制甚至是其它进制的整数,它们的转换方式见后文

    当一个整数以0b或0B开头,其后都是0、1时,默认识别为二进制整数

    当一个整数以0o或0O开头(数值零和大、小写的字母o),其后都是0-7之间的数值时,默认识别为8进制整数

    当一个整数以0x或0X开始,其后都是[0-9a-fA-F]之间的字符时,默认识别为十六进制

    python中的数值类型是不可变对象,不可变意味着不可原处修改。假如a = 3333,那么现在内存中会有一个内存块保存数值对象3333,如果修改它,比如对它加上1操作a += 1,python将创建一个新的内存块用来保存新的数值对象3334,而不是在3333那个内存块中直接修改为3334,所以那个原始的数值3333就被丢弃了,它会等待垃圾回收器去回收。关于可变、不可变对象,后面的文章将会经常提到,请先留意这两个词。

    数值基本运算

    支持最基本的数学运算符号:+ - * / % **、取正负+x -x,地板除法//,除法和取模divmod(x, y):

    >>> 123 + 345

    468

    >>> 345 - 123

    222

    >>> 1.5 * 4

    6.0

    >>> 2/5

    0.4

    >>> 2 % 3

    2

    >>> 3 ** 2

    9

    >>> 3.00 ** 2

    9.0

    >>> 3 ** 100

    515377520732011331036461129765621272702107522001

    >>> a = 3; b = -3

    >>> -a, -b

    (-3, 3)

    >>> divmod(5, 2)

    (2, 1)

    可见,python的数值计算方式非常直接,且python 3.x中会自动为整数提供无穷精度。正如上面最后一个计算表达式(3**100),它将所有数字都显示出来了。就算是计算3**10000,3**1000000,python也不会报错,不过3的100万次方,显然需要花上一段时间来计算。这和其它编程语言有所区别,例如java中计算Math.pow(3,10000)将返回Infinity,表示无穷大。

    又是几个注意事项:

    python中的除法运算/得到的结果总是浮点数(例如9/3=3.0),后面还有一种地板除法(floor)不一样。

    当数值部分有小数时,会自动转换为浮点数类型进行运算,而且会自动忽略参与运算的小数尾部的0。

    加号+和乘号*也能处理字符串:

    +可以连接字符串,例如"abc" + "def"得到abcdef

    *可以重复字符串次数,例如"a"*3得到"aaa","ab"*3得到"ababab"

    其它数学运算方法

    除了上面的基础算术运算符,还支持很多数值类型的运算符,例如:取反(~)、位移(>>)、位与(&)、位异或(^)、逻辑与(and)、逻辑或(or)。

    除此之外,还有几个python的内置数学函数:

    pow():求幂,如pow(2,3)=8

    abs():求绝对值,如abs(-3)=3

    round():四舍五入,如round(3.5)=4

    int():取整(截去小数部分),如int(3.5)=3

    float():转换成浮点数,如float(3)=3.0

    oct():十进制整数转换成八进制

    hex():十进制整数转换成十六进制整数

    bin():十进制整数转换成二进制

    ...等等...

    还有专门的数学模块math、取随机数的模块random等。

    浮点数

    由于硬件的原因,使得计算机对于浮点数的处理总是不精确的。

    例如,按照数学运算时,1.1-0.9=0.2,但实际得到的结果为:

    >>> 1.1-0.9

    0.20000000000000007

    它以高精度的极限趋近的值来显示。上面的趋近结果大于按照数学运算结果,但并不总是如此,例如下面的运算则是小于数学运算的结果:

    >>> 3.3-3.2

    0.09999999999999964

    由于浮点数不精确,所以尽量不要对两个浮点数数进行等值==和不等值!=比较.如果非要比较,应该通过它们的减法求绝对值,再与一个足够小(不会影响结果)的值做不等比较。

    例如:

    >>> (3.2-2.8) == 0.4

    False

    >>> abs((3.2-2.8)-0.4) < 0.0002

    True

    最后,浮点数并非总是输出很长精度的值。正如前面的运算:

    >>> 3.2+3.2

    6.4

    >>> 3/10

    0.3

    浮点数有两个特殊方法,一个是is_integer(),用来测试这个浮点数是否是整数,另一个是as_integer_ratio(),可以将浮点数转换成分子分母组成的元组,不过这个方法并非总是如你所想的那样友好。例如:

    >>> (3.0).is_integer()

    True

    >>> (3.2).is_integer()

    False

    >>> (2.5).as_integer_ratio()

    (5, 2)

    >>> (2.6).as_integer_ratio()

    (5854679515581645, 2251799813685248)

    浮点数总是不精确的,而且不能指定小数位数。但在python中,有一个专门的小数模块decimal,它可以提供精确的小数运算,还有一个分数模块fractions,也能提供精确的小数运算。

    真除法、Floor除法和小数位截断

    /:实现的是真除法。在python中,它总是返回浮点数值。

    //:实现的是floor地板除法,它会去掉除法运算后的小数位,以便得到小于运算结果的最大整数。如果参与运算的有小数,则返回浮点数,否则返回整数

    在math模块中,有地板函数math.floor()和天花板函数math.ceil()。它们的意义可以根据现实中地板、空气、天花板的高低位置来考虑。地板位于空气之下,地板运算的返回值是比空气小的最大整数,天花板位于空气之上,天花板运算的的返回值是比空气大的最小整数

    round(x, N)是四舍五入,可以指定四舍五入到哪个小数位

    math.trunc()是直接截断小数

    实际上int()函数自身就是字节截断小数的

    看下面的示例。

    真除法总是返回浮点数。

    >>> 9/3

    3.0

    >>> 10/4

    2.5

    >>> 10/4.0

    2.5

    >>> -9/2

    -4.5

    >>> -9/2.0

    -4.5

    floor除法返回浮点数还是整数取决于参与运算的数是否包含浮点数。

    >>> 9 // 3

    3

    >>> 10 // 4

    2

    >>> 10 // 4.0

    2.0

    对于正数的运算结果,floor除法是直接去除小数位的。对于负数结果,它是取比运算结果更小的负整数。。

    例如,负数结果的floor除法:

    >>> -9 // 3

    -3

    >>> -10 // 4

    -3

    >>> -10 // 3

    -4

    -10 / 4的结果是-2.5,floor要取比它小的最大整数,也就是-3。-10 / 3的结果是-3.3,floor要取比它小的最大整数,也就是-4。

    除了真除法和floor除法,还有四舍五入round()和math.trunc()两种截断小数的方式。例如:

    >>> round(10/4)

    2

    >>> round(-5.2/2)

    -3

    >>> import math # import表示导入某个模块

    >>> math.trunc(5/2)

    2

    >>> math.trunc(-5.2/2)

    -2

    int()也可以直接截断小数。

    >>> int(3.6)

    3

    >>> int(-3.6)

    -3

    数值类型的转换

    int()可以将字符串或浮点数转换成整数,也可以用于进制数转换

    float()可以将字符串或整数转换成浮点数

    实际上它们表示根据给定参数在内存中构造一个整数、浮点数对象,所以可以用来作为类型转换工具。而且,前面已经说过,int()可以用来截断小数位。

    >>> int(3.5) # 浮点数 -> 整数

    3

    >>> int(-3.6) # 浮点数 -> 整数

    -3

    >>> int('3') # 字符串 -> 整数

    3

    >>> float(3) # 整数 -> 浮点数

    3.0

    >>> float('3') # 字符串 -> 浮点数

    3.0

    int()还可用于进制数转换,见下文。

    小数类型(Decimal)

    小数模块decimal,它有一个函数Decimal(),它是精确的,是可以指定小数位数的。

    如果没有python基础,这里能看懂多少算多少,反正小数用的也不多。

    例如,使用浮点数计算

    >>> 0.1 * 3 - 0.3

    5.551115123125783e-17

    它本该等于0,但结果却是无限接近于0,因为计算机硬件用于存储数值位数的空间有限。

    使用decimal模块的Decimal()可以构造精确的小数。例如:

    >>> import decimal

    >>> decimal.Decimal('0.1') * 3 - decimal.Decimal('0.3')

    Decimal('0.0')

    注意,Decimal()的参数都是字符串,如果不加引号,它还是会解释成浮点数。

    >>> decimal.Decimal(0.1)

    Decimal('0.1000000000000000055511151231257827021181583404541015625')

    Decimal()的运算的结果会取最长的小数位数。

    >>> decimal.Decimal('0.1') * 3 - decimal.Decimal('0.300')

    Decimal('0.000')

    可以设置decimal的精度,也就是小数位数。有两种范围的精度:全局范围、局部范围。

    例如,没有设置精度时,会保留很多位数的小数。

    >>> import decimal

    >>> decimal.Decimal(1) / decimal.Decimal(7)

    Decimal('0.1428571428571428571428571429')

    设置全局范围的精度为4,即保留4位小数:

    >>> import decimal

    >>> decimal.getcontext().prec = 4

    >>> decimal.Decimal(1) / decimal.Decimal(7)

    Decimal('0.1429')

    全局范围的精度表示整个线程执行时,这个模块的精度都是4。

    还可以设置局部范围的精度,局部表示退出了这个范围就失效了。使用with/as语句可以设置局部精度,所以退出with/as语句块精度的设置就失效了。

    >>> with decimal.localcontext() as ctx:

    ... ctx.prec = 2

    ... decimal.Decimal(1) / decimal.Decimal(7)

    ...

    Decimal('0.14')

    >>> decimal.Decimal(1) / decimal.Decimal(7)

    Decimal('0.1429') # 因为前面设置了全局精度为4

    分数(Fraction)

    分数模块fractions,它有一个函数Fraction(),它可以构建分数。有了分数之后,可以参与运算。分数和浮点数不同,分数是精确的。

    同样地,如果没有python基础,这里能看懂多少算多少,反正用的也不多。

    例如,构建分数三分之一。

    >>> import fractions

    >>> fractions.Fraction(1,3)

    Fraction(1, 3)

    还可以根据浮点数的字符串格式构建分数。

    >>> fractions.Fraction('0.3')

    Fraction(3, 10)

    然后可以用分数进行运算。

    分数加整数:

    >>> fractions.Fraction(1,3) + 1

    Fraction(4, 3)

    分数加、减、乘、除分数:

    >>> fractions.Fraction(1,3) + fractions.Fraction(2,3)

    Fraction(1, 1)

    >>> fractions.Fraction(1,3) - fractions.Fraction(2,3)

    Fraction(-1, 3)

    >>> fractions.Fraction(1,3) * fractions.Fraction(2,3)

    Fraction(2, 9)

    >>> fractions.Fraction(1,3) / fractions.Fraction(2,3)

    Fraction(1, 2)

    实际上,float对象有一个as_integer_ratio()函数,可以将浮点数转换成整数的元组表示形式(元组后面的文章会介绍),然后根据这个元组就可以构造出分数来。

    例如,将2.5转换成元组,并进而转换成分数。

    >>> (2.5).as_integer_ratio()

    (5, 2) # 得到元组

    >>> fractions.Fraction(*(2.5).as_integer_ratio())

    Fraction(5, 2)

    进制整数的转换

    oct():十进制整数转换成八进制

    hex():十进制整数转换成十六进制整数

    bin():十进制整数转换成二进制

    例如,将十进制的64转换成二进制、八进制、十六进制整数。

    >>> bin(64),oct(64),hex(64)

    ('0b1000000', '0o100', '0x40')

    int()函数也能进行进制转换,它的用法格式为:

    int(x, base=10)

    base指定要将x解释成哪个进制位的数,然后转换成十进制数,也就是前面说的构造一个整数对象。不指定base时,默认解释成10进制。

    base的值可以是0或2-36之间的任意一个数,base=0也表示解释成10进制。

    例如,将二进制的数转换为十进制整数。

    >>> int('0b11',base=2)

    3

    >>> int('11',base=2)

    3

    既然x要解释成某个进制的数,那么超出这个进制的数自然不能出现。例如:

    将x解释成二进制数的时候,x里就不能包含除0、1之外的数(当然,前缀0b除外);

    解释成7进制,就不能出现7、8、9;

    解释成8进制,就不能出现8、9;

    解释成11进制,就只能出现0-9、a/A这些字符;

    12进制就只能出现0-9、aAbB这几个字符;

    36进制就只能出现0-9、a-zA-Z这几个字符。

    例如,将一个字符串解释为15进制,并转换成整数。15进制只能出现0-9、a-eA-E这几个字符。

    >>> int('93E', base=15)

    2084

    更多相关内容
  • 油藏数值模拟并行软件典型例的计算结果及性能分析借鉴.pdf
  • ——————— js 中对数值的格式化问题 对数字进行格式化输出,是非常有意义的一件事情,例如许多时候,我们希望一个数字能够输出为指定格式的字符串,拿26.9878来说,我们可能会希望它能保留两位小数来说出,即...
  • 应用FLAC3D软件含预制裂纹砂浆块和完整砂浆块试样在单轴压缩点荷载作用下的破碎过程进行了数值模拟.结果表明:完整砂浆块的破碎过程首先出现一个应力集中区,形成密实核,然后形成中间裂纹、径向裂纹、侧向裂纹,...
  • matlab编程,用法方程组实现最小二乘拟合四次多项式,例参考《数值分析》(梅立泉)P176的5.1
  • 通过建模拟得出下游村庄以及公路在溃坝危险区范围内,然后采用工程类比法,借鉴水库以及山体泥石流的研究成果,再根据某尾矿库溃坝的自身特点,预测溃坝矿砂流的最大流量、到达时间、淹没范围等,利用预测数据下游...
  • 为了研究盾构隧道衬砌内力分布规律,盾构隧道设计中常用的三种衬砌内力计算方法进行了归纳...采用有限元数值模拟方法,分析了土体泊松比盾构隧道管片弯矩的影响。研究表明,随着土体泊松比的增加,管片最大弯矩值减小。
  • 在与定常方程相容的情况...RAE2822、GAW-1等不同类型翼型进行了低速和跨声速流动的数值模拟。例表明:Choi预处理方法和Turkel预处理方法均有效改善了时间推进方法低马赫数流动计算的收敛性,而且提高了计算精度;
  • 三维圆管紊流流动状况的数值模拟分析 在工程和生活中圆管内的流动是最常见也是最简单的一种流动圆管流动有层流和紊流两种流动状 况层流 即液体质点作有序的线状运动 彼此互不混掺的流动 紊流 即液体质点流动的轨迹...
  • 成 绩 评 定 表 学生姓名 班级学号 专 业 信息与计算 课程设计题目 数值分析法案 科学 例 评 语 组长签字 成绩 日期 20 年 月 日 I 课程设计任务书 学 院 理学院 专 业 信息与计算科学 学生姓名 班级学号 课程设计...
  • 数 值 分 析 实 验 报 告 实验一 误差分析 实验 1.1 病态问题 实验目的算法有 优与 劣之分问题也有 好与 坏之别 对数值方法的研究而言所谓坏问题就是问题本身对扰动敏感者反之属于好 问题通过本实验可获得一个初步...
  • 为比较积分计算方法分子动力学模拟结果 的影响,通过模拟液态氩为介质的流体模型,比较了不同数值计算方法下所得的输运系数结果。为不同情况下分子动 力学数值计算方法的正确选择提供了参考。
  • 近断层强地面运动影响场显式有限元数值模拟的示意性例,张晓志,,本文通过一个简单的示意性例,近断层强地面运动影响场显式有限元数值模拟的主要环节作了概要展开说明,给出了例的主要计算
  • 当基础风险资产遵循跳跃扩散时,我们... 通过数值算例验证了所提出数值框架的正确性。 我们还讨论了现实金融模型的有效边界的影响,例如不同的借贷利率、交易成本和投资组合的约束,例如借贷和偿付能力的最大限制。
  • 为了改进边界元方法中的强奇异积分方程的数值算法,通过奇异积分大量文献的研究,提出了一种强奇异积分方程的数值解法,该方法通过Chebyshev多项式展开和方程奇异性的降低,有效的改进了强奇异方程的数值求解方法,并将...
  • 为了解决分数阶微分方程数值解的问题,采用Haar小波算子矩阵的方法,研究了一类变系数分数阶微分...最后给出数值算例验证了该方法的可行性和有效性.数值计算结果表明:随着取点数的增多,数值解与精确解的近似度越来越高.
  • 方法 基于腾讯云等云计算环境,介绍云计算用于结构地震响应分析的可行性,并云计算环境的搭建进行说明.利用OpenSees等软件,具体分析比较不同自由度数、不同规模的例在云平台及本地计算环境中的计算效率.结果 云...
  • 在传统的应力平衡方程基础上,结合岩土介质饱和-非饱和渗流理论,考虑边坡岩土体的非...结合数值算例,降雨条件下非饱和土质边坡进行了流固耦合分析。研究结果可为降雨条件下边坡稳定性分析和滑坡预测提供技术支持。
  • 例结果表明电子封装体的热-结构特性分析采用有限元数值模拟是可行的,并据此分别以最大应力最小化和封装体质量最轻为目标,封装体进行了优化设计,为提高封装件的可靠性和优化设计提供了理论依据.
  • 为了模拟混凝土重力坝在地震作用下的损伤演变过程,采用混凝土塑性损伤本构理论,考虑应变速率变化以及混凝土材料损伤引起的刚度退化,利用有限元软件ABAQUS某混凝土大坝进行了数值计算。分析结果表明:由于混凝土的抗...
  • 概率统计中所运用到的一些基本例进行计算,辅助理解概率学中一些复杂的知识点
  • 数值流形方法常基于有限元法三结点或四结点单元.在八结点单元构成的网格上构建流形覆盖和权函数,采用拉格朗日乘子法施加位移约束条件,推导了分析静态问题的计算列式.无需细致网格划分即可更精确地分析具有曲线...
  • 用Python实现数值积分

    千次阅读 2022-02-08 09:21:14
    本文主要用于对比使用Python来实现数学中积分的几种计算方式,并和真值进行对比,加深大家积分运算实现方式的理解。 闲话少说,我们直接开始吧。 :) 2. 举个栗子 为了加深大家的印象,首先我们来看个例子: ...

    1. 引言

    本文主要用于对比使用Python来实现数学中积分的几种计算方式,并和真值进行对比,加深大家对积分运算实现方式的理解。

    闲话少说,我们直接开始吧。 :)

    2. 举个栗子

    为了加深大家的印象,首先我们来看个例子:
    对下述三次函数
    f ( x ) = x 3 − 4 x 2 + 4 x + 2 f(x)=x^3-4x^2+4x+2 f(x)=x34x2+4x+2
    进行积分运算:
    I = ∫ a b f ( x ) d x = ∫ a b ( x 3 − 4 x 2 + 4 x + 2 ) d x   I = \int_a^bf(x)dx= \int_a^b(x^3-4x^2+4x+2)dx\, I=abf(x)dx=ab(x34x2+4x+2)dx
    图示如下:
    在这里插入图片描述
    如果 a = 1 / 2 a=1/2 a=1/2 , b = 5 / 2 b=5/2 b=5/2,则上述积分的值为:

    I = ( x 4 4 − 4 x 3 3 + 2 x 2 + 2 x ) ∣ a b = 61 12 ≈ 5.0833 I=(\frac{x^4}{4}-\frac{4x^3}{3}+2x^2+2x)|_{a}^{b}=\frac{61}{12} \approx 5.0833 I=(4x434x3+2x2+2x)ab=12615.0833

    3. 矩形计算面积

    我们知道,在数学中,积分运算表示上述曲线和x轴围成的封闭区域的面积,为此,我们在数值预算中,来近似计算上述区域的面积,最直观的想法就是拆成一个个小的矩形来计算对应的面积。

    3.1 左侧边长计算面积

    为了计算每个小矩形的面积,设计到边长高的选择,这里我么以左侧函数取值作为对应矩形的高来计算相应的小矩形的面积,图示如下:
    在这里插入图片描述

    对应的代码如下:

    import numpy as np
    x = np.linspace(0, 3, 1001)
    f = lambda x: x**3 - 4*x**2 + 4*x + 2
    a = 0.5
    b = 2.5
    Ax = np.linspace(a, b, 101)
    Ay = f(Ax)
    def defInt_left(f, a, b, N):
        # left-hand point
        result = 0; FX = []; Xn = []
        dx = abs(b - a)/N
        while a < b:
            result += f(a)*dx
            FX += [f(a)]
            Xn += [a]
            a += dx
        return result, FX, Xn, dx
    N = 4
    I_left, FX, Xn, dx = defInt_left(f, a, b, N)
    print(I_left)
    

    上述代码中,我们将横坐标拆分为4小份,也就是拆分成4个小矩形,然后使用函数左侧的点坐位小矩形的高,上述代码的运行结果如下:

    5.25
    

    3.2 右侧边长计算面积

    这里和上述原理类似,只不过每个小矩形的高采用右侧边长函数取值来近似计算,图例如下:
    在这里插入图片描述
    样例代码如下:

    def defInt_right(f, a, b, N):
        # right-hand point
        result = 0; FX = []; Xn = []
        dx = abs(b - a)/N
        while a < b:
            result += f(a + dx)*dx
            FX += [f(a + dx)]
            Xn += [a]
            a += dx
        return result, FX, Xn, dx
    
    N = 4
    I_right, FX, Xn, dx = defInt_right(f, a, b, N)
    print(I_right)
    

    运行结果如下:

    5.0
    

    3.3 中值边长计算面积

    看了上述两种近似计算方式,有同学就说有取左侧点算出来面积大的,有取右侧点算出来面积小的,那干脆折中一下,我们来以中值坐位矩形的高来计算对应的面积。图例如下:
    在这里插入图片描述
    代码实现如下:

    def defInt_middle(f, a, b, N):
        # middle point
        result = 0; FX = []; Xn = []
        dx = abs(b - a)/N
        while a < b:
            result += f(a + dx/2)*dx
            FX += [f(a + dx/2)]
            Xn += [a]
            a += dx
        return result, FX, Xn, dx
    
    N = 4
    I_mid, FX, Xn, dx = defInt_middle(f, a, b, N)
    print(I_mid)
    

    运行结果如下:

    5.0625
    

    4. 梯形计算面积

    读到这里的同学可能会思考,既然可以将封闭区域划分成一个个的小矩形,那当然也可以将其划分成梯形来近似计算相应的面积,图例如下:
    在这里插入图片描述
    样例代码如下:

    def defInt_trapezoid(f, a, b, N):
        # trapezoidal rule
        result = 0; FXa, FXb = [], []; Xn = []
        dx = abs(b - a)/N
        while a < b:
            result += (f(a) + f(a + dx))*dx/2
            FXa += [f(a)]; FXb += [f(a + dx)]
            Xn += [a]
            a += dx
        return result, FXa, FXb, Xn, dx
    
    N = 4
    I_trap, FXa, FXb, Xn, dx = defInt_trapezoid(f, a, b, N)
    print(I_trap)
    

    运行结果如下:

    5.125
    

    5. 真值比对

    最后,我们来针对不同的N来讲封闭区域划分成对应的小份,分别针对性的计算上述四种方式的积分值,样例代码如下:

    Nx = range(1, 11)
    I1, I2, I3, I4 = [], [], [], []
    for Ni in Nx:
        i1, *_ = defInt_left(f, a, b, Ni); I1 += [i1];
        i2, *_ = defInt_right(f, a, b, Ni); I2 += [i2];
        i3, *_ = defInt_middle(f, a, b, Ni); I3 += [i3];
        i4, *_ = defInt_trapezoid(f, a, b, Ni); I4 += [i4];
    

    最后将其与真值进行对比,如下:

    在这里插入图片描述
    可以看出,随着划分区域的增多,采用梯形计算面积方式最逼近真值。

    6. 总结

    本文重点介绍了使用不同面积划分方法来近似计算积分取值的原理和相应的代码实现,其中采用梯形计算面积的方式随着划分子区域数目的增加最接近真值,推荐大家使用。

    您学废了吗?

    在这里插入图片描述
    关注公众号《AI算法之道》,获取更多AI算法资讯。

    展开全文
  • 利用非结构化的有限体积方法,建立了二维浅水方程高精度、高分辨...通过水滴模型进行验证。并应用此模型98年胖头泡分滞洪区分洪过程进行模拟,获得滞洪区不同时段的淹没范围和淹没水深,为防洪救灾提供了依据。
  • 应用小波自相关函数的插值性质,得到任意给定函数的插值小波表达式,然后其直接求导,可以得到函数导数的表达式。导数运算不再应用差分算法,扩展了小波方法在数值求解微分方程中的应用。由于小波基函数的有限支撑特点...
  • 目的在细观层次上混凝土进行数值模拟,进而混凝土的力学性能分析。...最后,通过一个数值算例验证了所提方法的有效性。结论笔者提出的RAS产生方法为进一步开发混凝土细观有限元模型打下了坚实的基础。
  • 应用有限差分法某矿1303工作面进行了数值分析。根据1303工作面的地质资料建立了数值模型,并模拟了工作面的开采过程,底板的应力变形特征进行了重点研究。最后结合底板声波探测1303工作面底板破坏情况进行了综合...
  • 利用matlab求解数值积分

    千次阅读 2021-04-26 18:09:12
    1 数值积分基本原理求解定积分的数值方法多种多样,如简单的梯形法、辛普生(Simpson)法、牛顿-柯特斯(Newton-Cotes)法等都是经常采用的方法。它们的基本思想都是将整个积分区间[a, b]分成n个子区间[xi, xi+1],i=1,...

    1  数值积分基本原理

    求解定积分的数值方法多种多样,如简单的梯形法、辛普生(Simpson)法、牛顿-柯特斯(Newton-Cotes)法等都是经常采用的方法。

    它们的基本思想都是将整个积分区间[a, b]分成n个子区间[xi, xi+1],i=1, 2,…, n,其中x1 = a,xn+1 = b。这样求定积分问题就分解为求和问题。

    2  数值积分的实现方法

    2.1  变步长辛普生法

    基于变步长辛普生法,MATLAB给出了quad函数来求定积分。该函数的调用格式为:

    [I, n] = quad('fname', a, b, tol, trace)

    其中fname是被积函数名。a和b分别是定积分的下限和上限。tol用来控制积分精度,缺省时取tol=0.001。trace控制是否展现积分过程,若取非0则展现积分过程,取0则不展现,缺省时取trace=0。返回参数I即定积分值,n为被积函数的调用次数。

    例1求定积分:

    be4613615cdd773a54e1ecc53a5891ae.png

    (1) 建立被积函数文件fesin.m。

    function f=fesin(x)

    f=exp(-0.5*x).*sin(x+pi/6);

    (2) 调用数值积分函数quad求定积分。

    [S,n]=quad('fesin',0,3*pi)

    (S为返回值,n是调用次数)

    2.2  牛顿-柯特斯法

    基于牛顿-柯特斯法,MATLAB给出了quad8函数来求定积分。该函数的调用格式为:

    [I, n] = quad8('fname', a, b, tol, trace)

    其中参数的含义和quad函数相似,只是tol的缺省值取10-6。该函数可以更精确地求出定积分的值,且一般情况下函数调用的步数明显小于quad函数,从而保证能以更高的效率求出所需的定积分值。

    例2  求定积分:

    32326e33967b86db7829a692bd9b913c.png

    (1) 被积函数文件fx.m。

    function f=fx(x)

    f=x.*sin(x)./(1+cos(x).*cos(x));

    (2) 调用函数quad8求定积分。

    I=quad8('fx',0,pi)

    例3 分别用quad函数和quad8函数求定积分

    095b29ce3a9bc3394e91d9565a4bacd8.png

    的近似值,并在相同的积分精度下,比较函数的调用次数。

    1)调用函数quad求定积分:

    format long;

    fx=inline('exp(-x)');

    [I,n] = quad(fx,1,2.5,1e-10)

    2)调用函数quad8求定积分:

    format long;

    fx=inline('exp(-x)');

    [I,n]=quad8(fx,1,2.5,1e-10)

    2.3  被积函数由一个表格定义

    (要求积分,但是函数没有直接给出,只是自己在做实验时得到的一组相关联的数据)

    在MATLAB中,对由表格形式定义的函数关系的求定积分问题用trapz(X,Y)函数。其中向量X,Y定义函数关系Y=f(X)。

    例4  用trapz函数计算定积分。

    命令如下:

    X=1:0.01:2.5;

    Y=exp(-X);        %生成函数关系数据向量

    trapz(X,Y)

    ans =

    0.28579682416393

    3  二重定积分的数值求解

    使用MATLAB提供的dblquad函数就可以直接求出上述二重定积分的数值解。该函数的调用格式为:

    I = dblquad(f,a,b,c,d,tol,trace)

    该函数求f(x,y)在[a,b]×[c,d]区域上的二重定积分。参数tol,trace的用法与函数quad完全相同。

    例5  计算二重定积分

    301ce27141e2f07219b6899007a83fe1.png

    (1) 建立一个函数文件fxy.m:

    function f=fxy(x,y)

    global ki;

    ki=ki+1;           %ki用于统计被积函数的调用次数

    f=exp(-x.^2/2).*sin(x.^2+y);

    (2) 调用dblquad函数求解。

    global ki;ki=0;

    I=dblquad('fxy',-2,2,-1,1)

    ki

    展开全文
  • 求解受双边约束或者单双边约束共同作用的多体系统动力学问题时,可能发生约束方程的违约问题。为避免处理违约问题,在现有单边约束多体系统动力学的研究成果基础上,给出了一种...最后通过数值算例验证了方法的有效性。
  • 研究二维有限域上的扩散系数与空间变量相关的空间分数阶扩散方程,通过移位的Grunwald公式空间分数阶导数进行离散,得到交替差分格式,证明了格式的稳定性,最后给出了数值算例.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 174,373
精华内容 69,749
关键字:

对数值怎么算