集成到if语句中? (蟒蛇)

问题描述 投票:0回答:2

我是否可以集成但在循环中设置我的集成限制? 那么,例如,将我的函数从 8 积分到 8.9,直到达到值 2.5? 谢谢!

f1 = lambda x,c : c/x
integrate1=quad(f, 8,8.97, args=c1)
print(integrate1)

也许?

for index in range(8,9):
    f1 = lambda x,c: c/x
    integrate1 = quad(f, index, index+0.1, args=c1)
    print(integrate1)
python scipy numerical-integration
2个回答
1
投票

对于具有固定步骤的非整数循环,您可以执行类似的操作:

for val in xrange(80, 90):
    val /= 10
    ........

val = 8.0
while val<8.9:
    <do your worst>
    val += step

途中舍入可能是个好主意 - 以获得所需的精度


0
投票

嗯,显然你可以这样做:

import numpy as np
import scipy.integrate as si

def test_fn(x, c):
    return c / x

def main():
    lower_limit =  8.0
    target_area =  2.5
    c_val       = 42.0
    for upper_limit in np.arange(8., 10., 0.1):
        area = si.quad(test_fn, lower_limit, upper_limit, args=(c_val,))
        if area >= target_area:
            print("Area is {} at ul={}".format(area, upper_limit))
            break

if __name__=="__main__":
    main()

但是您的步数间隔限制了结果的准确性,并且您正在进行大量不必要的计算(==慢)。

正如@Jakob_Weisblat 所说,您可以切换到二分搜索算法。这样更快,但你必须做一些额外的簿记工作。为什么不委托?

我建议将其变成一个元问题:求解上限,以便将结果整合到您想要的目标值中:

import functools
import scipy.integrate as si
import scipy.optimize as so

def test_fn(x, c):
    return c / x

def integrate_fn(ul, fn, ll, args, target):
    return si.quad(fn, ll, ul, args=args) - target

def main():
    lower_limit =  8.0
    target_area =  2.5
    c_val       = 42.0
    sol = so.brentq(
        integrate_fn, lower_limit, 20.0, args=(
            test_fn, lower_limit, (c_val,), target_area
        )
    )
    print(sol)

if __name__=="__main__":
    main()

(请注意,此代码未经测试,因为这台机器没有安装 scipy。)

© www.soinside.com 2019 - 2024. All rights reserved.