gpt4 book ai didi

使用定标器进行导数检查

转载 作者:行者123 更新时间:2023-12-04 20:10:00 24 4
gpt4 key购买 nike

我有一个问题,我想缩放设计变量。我已经添加了缩放器,但我想检查导数以确保它正在执行我想要的操作。有没有办法检查缩放导数?我尝试使用 check_total_derivatives() 但无论我为缩放器设置什么值,导数都是完全相同的:

from openmdao.api import Component, Group, Problem, IndepVarComp, ExecComp
from openmdao.drivers.pyoptsparse_driver import pyOptSparseDriver

class Scaling(Component):
def __init__(self):
super(Scaling, self).__init__()
self.add_param('x', shape=1)
self.add_output('y', shape=1)

def solve_nonlinear(self, params, unknowns, resids):
unknowns['y'] = 1000. * params['x']**2 + 2

def linearize(self, params, unknowns, resids):
J = {}
J['y', 'x'] = 2000. * params['x']
return J


class ScalingGroup(Group):
def __init__(self,):
super(ScalingGroup, self).__init__()
self.add('x', IndepVarComp('x', 0.0), promotes=['*'])
self.add('g', Scaling(), promotes=['*'])

p = Problem()
p.root = ScalingGroup()

# p.driver = pyOptSparseDriver()
# p.driver.options['optimizer'] = 'SNOPT'
p.driver.add_desvar('x', lower=0.005, upper=100., scaler=1000)
p.driver.add_objective('y')
p.setup()
p['x'] = 3.

p.run()
total = p.check_total_derivatives()
# Derivative is the same regardless of what the scaler is.

最佳答案

缩放器和加法器的行为是一致的,因此检查导数例程以未缩放的形式给出结果,以便更加直观。

如果您确实想了解当 NLP 看到缩放后的值并且您正在使用 SNOPT 时缩放器会产生什么影响,您可以添加 SNOPT 的导数检查功能:


p.driver.opt_settings['验证级别'] = 3

SNOPT_print.out 将包含,缩放器设置为 1:
列 x(j) dx(j) 元素编号行导数差值近似
1 3.00000000E+00 2.19E-06 目标 6.00000000E+03 6.00000219E+03 正常

或者如果我们将 x 缩放器更改为 1000:

Column       x(j)        dx(j)    Element no.    Row        Derivative    Difference approxn
1 3.00000000E+03 1.64E-03 Objective 6.00000000E+00 6.00000164E+00 ok

因此,在 check_total_derivatives 使用的问题单位中,导数不会改变。但优化器看到的缩放值正在发生变化。

关于使用定标器进行导数检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37061899/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com