LMFIT - 创建用于处理电路模型的模型
LMFIT - Creating models for working with electrical circuit models
我有一个电路的分析模型,其输出是 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,我就是想知道;
问题一:
lmfit.models.ExpressionModel 可以处理复杂的表达式吗? (如包含复杂变量)
..和;
问题2(可选):
如果没有,我可以用 lmfit.Model 代替吗? IE。只需定义一个 objective 函数,其中 returns 是一个复杂的值,然后像这样将它提供给 lmfit.Model;
def _z1(s, r1, l1):
return r1 + l1 * s
z1 = lm.Model(_z1)
它在 lmfit.Model 的文档中说它会自动生成残差函数,但是如果我只使用我自己的残差函数来拟合生成的复合模型,它是否会被使用?
还有;
问题三:
这样做不明智吗? IE。它会导致大量开销吗?
我相信 ExpressionModel()
可以处理复杂的值。但我仍然会推荐您在 Q2 中的方法:定义一个完成工作的函数,因为它会更容易排除故障并在需要时进行扩展。
而且,是的,完成的独立数据和计算肯定可以包含复杂的值。但是,尽管您的计算可能很复杂,但 returned 残差需要是纯实数。最简单的方法是使用 numpy 数组的 view
方法 return real/imag 对:
return complex_array_for_residual.view(np.float)
你可以考虑 returning mag/phase 对,虽然它稍微复杂一些,因为你必须处理相位跳跃。
需要说明的是,我经常使用给出复杂结果的傅里叶变换进行拟合,然后将其转换为“real/imag”与 ndarray.view
对。
我有一个电路的分析模型,其输出是 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,我就是想知道;
问题一:
lmfit.models.ExpressionModel 可以处理复杂的表达式吗? (如包含复杂变量)
..和;
问题2(可选):
如果没有,我可以用 lmfit.Model 代替吗? IE。只需定义一个 objective 函数,其中 returns 是一个复杂的值,然后像这样将它提供给 lmfit.Model;
def _z1(s, r1, l1):
return r1 + l1 * s
z1 = lm.Model(_z1)
它在 lmfit.Model 的文档中说它会自动生成残差函数,但是如果我只使用我自己的残差函数来拟合生成的复合模型,它是否会被使用?
还有;
问题三:
这样做不明智吗? IE。它会导致大量开销吗?
我相信 ExpressionModel()
可以处理复杂的值。但我仍然会推荐您在 Q2 中的方法:定义一个完成工作的函数,因为它会更容易排除故障并在需要时进行扩展。
而且,是的,完成的独立数据和计算肯定可以包含复杂的值。但是,尽管您的计算可能很复杂,但 returned 残差需要是纯实数。最简单的方法是使用 numpy 数组的 view
方法 return real/imag 对:
return complex_array_for_residual.view(np.float)
你可以考虑 returning mag/phase 对,虽然它稍微复杂一些,因为你必须处理相位跳跃。
需要说明的是,我经常使用给出复杂结果的傅里叶变换进行拟合,然后将其转换为“real/imag”与 ndarray.view
对。