【问题标题】:Numerical differentiation with python用python进行数值微分
【发布时间】:2021-12-29 12:41:00
【问题描述】:

我有这样一个任务:

您需要编写一个具有以下签名的函数: def derForward(f, I, h) 这个函数应该作为输入函数????和段????作为两个元素的 Python 列表 --- 段的末端。 在功能中,您被要求划分段????分成长度为 ℎ 的小段,从而得到一个网格 ???? .您的函数应返回 dy --- 每个点 x 的前向差异(边界除外,因为公式要求下一个值)。您应该返回相同长度的 x 和 dy 数组。

我的答案是这样的:

xx = [] #list of x values
frw = [] #list of forw. differencies of x

def derForward(f, I, h):
    x = np.arange(I[0], I[1], h)
    f = np.vectorize(f)
    for x_ in x[:-1]:
        dxdy = (f(x_+h)-f(x_))/ h
        xx.append(x_)
        frw.append(dxdy)
    x = np.array(xx)
    dy = np.array(frw)
    return x, dy

此函数必须通过 3 次错误和准确性测试。但是现在测试 2 和 3 都失败了。我不明白为什么我只能通过 1 次测试。 检查器如下所示:

import numpy as np
from math import *


from time import time

def findif_check(derForward):
    count=0
    I=[0.001, 2*np.pi]
    f=lambda x: sin(x)
    h=0.01
    st=time()
    x, dy=derForward(f, I, h)
    dur=time()-st

    if x.shape[0]!=dy.shape[0]:
        print('FAILED: x and dy shape mismatch!')
    else:
        df=lambda x: cos(x)    
        err=np.max(np.abs(dy-np.vectorize(df)(x)))
        print('Test 1 |::|  err=', np.max(np.abs(dy-np.cos(x))), '  |::|  time: ', dur, 's')
        if err<2*0.0075:
            count+=1
            print('Test 1 |::|  accuracy OK') 
        else:
            print('Test 1 |::|  accuracy FAIL') 
        f=lambda x: x**x
        I=[0.001, 1]

        st=time()
        x, dy=derForward(f, I, h)
        dur=time()-st
        
        df=lambda x: x**x*(log(x)+1)
        err=np.max(np.abs(dy-np.vectorize(df)(x)))
        print('Test 2 |::|  err=', err, '  |::|  time: ', dur, 's')
        if err<2:
            count+=1
            print('Test 2 |::|  accuracy OK')
        else:
            print('Test 2 |::|  accuracy FAIL')

        f=lambda x: e**(-x**2)
        I=[0.001, 1]

        st=time()
        x, dy=derForward(f, I, h)
        dur=time()-st
        
        df=lambda x: -2*x*e**(-x**2)
        err=np.max(np.abs(dy-np.vectorize(df)(x)))
        print('Test 3 |::|  err=', err, '  |::|  time: ', dur, 's')
        if err<2*0.01:
            count+=1
            print('Test 3 |::|  accuracy OK')
        else:
            print('Test 3 |::|  accuracy FAIL')
    print('Passed: ', count, '/ 3')
   

【问题讨论】:

    标签: python differentiation


    【解决方案1】:

    因为在运行测试 2 和 3 时,变量 xxfrw 包含测试 1 的数据。

    所以将xxfrw的定义移到def derForward(f, I, h):中,如下:

    def derForward(f, I, h):
        xx = [] #list of x values
        frw = [] #list of forw. differencies of x
    
        x = np.arange(I[0], I[1], h)
        f = np.vectorize(f)
        // ... ... ... ...
    

    然后所有 3 次测试都通过了:

    Test 1 |::|  err= 0.004999976659897233   |::|  time:  0.04198646545410156 s
    Test 1 |::|  accuracy OK
    Test 2 |::|  err= 1.715675908387758   |::|  time:  0.007221221923828125 s
    Test 2 |::|  accuracy OK
    Test 3 |::|  err= 0.009999270029526776   |::|  time:  0.00669407844543457 s
    Test 3 |::|  accuracy OK
    Passed:  3 / 3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 1970-01-01
      相关资源
      最近更新 更多