首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数打印正确的结果,返回错误的值。

函数打印正确的结果,返回错误的值。
EN

Stack Overflow用户
提问于 2022-01-20 22:21:39
回答 1查看 75关注 0票数 0

我知道有数以百万计的类似问题,但我无法解决我的案子。我有一个由4列组成的数据集(能量相对于3个极化中介电函数的虚部)。我想应用Kramers-Kronig关系来找到每个能量点的真实部分,所以结果将与输入数据在相同的维度上。为了mwe,数据文件如下所示:

代码语言:javascript
复制
 1.92000     0.45314     0.45774     0.44148
 1.92100     0.45387     0.45846     0.44223
 1.92200     0.45460     0.45918     0.44297
 1.92300     0.45533     0.45990     0.44372
 1.92400     0.45605     0.46062     0.44446
 1.92500     0.45677     0.46134     0.44520

到目前为止,我的代码是:

代码语言:javascript
复制
import numpy as np
import math

data = np.loadtxt('opt.mgsin2gan', skiprows=1)
dw = data[1,0] - data[0,0]

## This is the expression being integrated.
def frac(x,pol):                
    arg = len(data)
    mid = 0
    for i in range(len(data)):
        if data[i,0] == x:
            pass
        else:
            mid += data[i,0]*data[i,pol]/(data[i,0]**2-x**2)
#            return 1+(2/math.pi)*mid*dw
            result = 1+(2/math.pi)*mid*dw
    print(result)

## Evaluates the expression for every energy point
def grid(a):
    for i in data[:,0]:
        frac(i,a)
#    return frac(i,a)

## Evaluates the expression for each polarization
def polarization():
    for i in [1,2,3]:
        grid(i)
#    return grid(i)
if __name__ == "__main__":
    polarization()

它在屏幕上打印结果,但我无法将数据保存在文本文件中,因为它不返回任何内容。但是,当我取消对每个函数中的返回行的注释时,我会得到错误的结果。如何将结果保存在numpy数组中?此外,我如何使这段代码更优雅呢?简化它可能会使它在更短的时间内运行。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-20 23:44:47

我猜你是在找这样的东西:

代码语言:javascript
复制
def frac(x,pol):                
    arg = len(data)
    mid = 0
    for i in range(len(data)):
        if data[i,0] == x:
            pass
        else:
            mid += data[i,0]*data[i,pol]/(data[i,0]**2-x**2)
#            return 1+(2/math.pi)*mid*dw
            result = 1+(2/math.pi)*mid*dw
    print(result)
    return result

## Evaluates the expression for every energy point
def grid(a):
    # return list here
    return [frac(i, a) for i in data[:,0]]

## Evaluates the expression for each polarization
def polarization():
    # yield values for each i
    for i in [1,2,3]:
        yield from grid(i)

result = list(polarization())

我已经更改了grid函数以返回一个列表,并修改了polarization函数以生成每个i的值。

顺便说一句,当您处理浮点数时,行if data[i,0] == x可能很危险。相反,您可能需要检查两个数字是否在数字上接近,例如使用np.isclose

在这种情况下,很可能可以加快重写numpy代码或使用numba的速度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70794138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档