【问题标题】:LMFIT - Creating models for working with electrical circuit modelsLMFIT - 创建用于处理电路模型的模型
【发布时间】:2020-10-14 00:13:06
【问题描述】:

我有一个电路的分析模型,其输出是 s 域中的传递函数,我正在使用 LMFIT 来拟合电路组件的值,以获得最佳的 TF拟合测量数据集。

我想让我的代码更加模块化,我认为一个好的方法是这样的;

import lmfit as lm

z1 = lm.models.ExpressionModel('r1 + l1 * x')

z2 = lm.models.ExpressionModel('1 / (c1 * x)')

rlc = z1 * z2 / (z1 + z2)

这里的 x 是 s,形式的复数自变量; s = 2 * pi * j * f

我知道,为了拟合复杂数据,您需要将函数包装在一个产生真实输出的函数中,但最后在拟合生成的 CompositeModel 时,我将采用 TF 的幅度 (abs()),我只是想知道;

问题 1:

lmfit.models.ExpressionModel 可以处理复杂的表达式吗? (如包含一个复杂的变量)

..和;

问题 2(可选):

如果没有,我可以用 lmfit.Model 代替吗? IE。只需定义一个返回复杂值的目标函数,然后像这样将其提供给 lmfit.Model;

def _z1(s, r1, l1):
    return r1 + l1 * s

z1 = lm.Model(_z1)

它在 lmfit.Model 的文档中说它会自动生成残差函数,但是如果我只使用自己的残差函数拟合生成的复合模型,这是否会被使用?

还有;

问题 3:

这是不明智的吗? IE。会导致大量开销吗?

【问题讨论】:

    标签: python optimization simulation lmfit circuit-diagram


    【解决方案1】:

    我相信ExpressionModel() 可以处理复杂的值。但我仍然会推荐您在 Q2 中的方法:定义一个可以完成工作的函数,因为它会更容易在需要时进行故障排除和扩展。

    而且,是的,所做的独立数据和计算肯定可以包含复数值。但是,虽然您的计算可能很复杂,但返回的残差必须是纯真实的。最简单的方法是使用 numpy 数组的 view 方法返回实数/图像对:

    return complex_array_for_residual.view(np.float)
    

    您可以考虑返回磁/相位对,尽管它稍微复杂一些,因为您必须处理相位中的相位跳跃。

    为了清楚起见,我经常使用给出复杂结果的傅立叶变换进行拟合,然后将其转换为“实数/图像”对 ndarray.view

    【讨论】:

    • 感谢您的回答,但我仍然不明白您的回答是否可以从模型中返回复杂数据,并且可以毫无问题地添加、相乘等来自每个模型的复杂数据?,我无法在返回结果之前将结果转换为幅度和相位,因为这破坏了能够对我创建模型的阻抗进行代数的整个概念,每个模型返回的数据都必须很复杂,我只能在拟合/获取残差之前将其转换为幅度/相位..
    • @Vinzent 我更新了答案以更明确地描述使用ndarray.view 将实数和虚数对放入纯浮点数的数组中 - 是的,模型函数确实需要返回一个浮点数( 64 位)数组。
    猜你喜欢
    • 2020-10-11
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 2019-05-11
    • 1970-01-01
    • 2013-12-13
    • 2012-10-02
    相关资源
    最近更新 更多