Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
集成在if语句中?(python)_Python_Integrate - Fatal编程技术网

集成在if语句中?(python)

集成在if语句中?(python),python,integrate,Python,Integrate,我是否可以进行集成,但在循环中设置集成限制? 例如,将我的函数从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(i

我是否可以进行集成,但在循环中设置集成限制? 例如,将我的函数从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)

对于具有固定步长的非整数循环,可以执行以下操作:

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

val=8.0
虽然val嗯,显然你可以做到:

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

正如@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。)

在较低的代码块中有几个语法错误,在
for…
之后应该有一个
,循环的以下内部部分应该缩进。另外,你的名字
f
f1
应该是一样的。我对你在这里提出的问题有点困惑,你说的“将我的函数从8积分到8.9,直到它达到2.5”是什么意思?我有一个分布c/x,基本上我需要找到第95个百分位(该分布的置信区间)。我迭代的低端是8,高端是20。所以,我需要从,比方说,到8.5积分,得到2.5的置信区间。我试图以某种方式循环积分,这样当它发现和为2.5时,它就会停止。希望这更清楚一点!也许我也可以做一个求和,比如c/x=cln(x)的积分。我将尝试这样做,以及看看会发生什么。。。比如,对于范围内的索引(小步):res=res cln(index),如果res感谢您!我试试看!
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()
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()