如何使用有限数据的数学约束来约束lmfit?

如何解决如何使用有限数据的数学约束来约束lmfit?

在@M Newville提出建设性意见后,我更改了最初的问题,以便提出一个最小的例子。

我在不同条件下进行了实验。在条件1中,我有比条件2更多的实验数据:

import numpy as np
from lmfit import minimize,Parameters,fit_report    

# CONDITION 1.

x_data_1  = np.array([4.68,4.70,4.71,4.72,4.74])
y_data_1  = np.array([7.01,7.03,7.04,7.04]) 
z_data_1  = np.array([5.67,5.67,5.68,5.69,5.72])

n1_data_1 = np.array([0.374,0.371,0.369,0.376,0.375])
n2_data_1 = np.array([0.284,0.284,0.282,0.283])
n3_data_1 = np.array([0.284,0.283])

# CONDITION 2.

x_data_2  = np.array([10.72,10.68,10.77,10.76,10.79])

n1_data_2 = np.array([0.207,0.205,0.203,0.224,0.205])

但是,我需要Y>Z>X才能同时满足这两个条件。由XYZ计算出的Function_XFunction_YFunction_Z取决于参数A,{{1} },BCD。与EN1N2描述的N3Function_N1Function_N2一样。

Function_N3

一方面,由于数据量较大,# FUNCTIONS. def Function_X(A,B,C,E): return C-B**2/(A-E) def Function_Y(A,E): return (4*E*((A-E)*C-B**2))/(A*C-B**2) def Function_Z(A,D,E,X,Y): return 4*(1/X+1/Y+1/D-B/((A-E)*C-B**2))**(-1) def Function_N1(A,E): return B/(2*(A-E)) def Function_N2(A,E): return 2*E*B/(A*C-B**2) def Function_N3(A,E): return ((A-2*E)*C-B**2)/(A*C-B**2) 可以实现所需的FitFunction1Y>Z>X),而无需使用任何数学约束。

y_computed_1>z_computed_1>x_computed_1

另一方面,由于数据量较小,# FIT FUNCTION (CONDITION 1). def FitFunction1(params1,x_data_1=None,y_data_1=None,z_data_1=None,n1_data_1=None,n2_data_1=None,n3_data_1=None): # MODEL. x_mod = Function_X(params1['A'],params1['B'],params1['C'],params1['E']) y_mod = Function_Y(params1['A'],params1['E']) z_mod = Function_Z(params1['A'],params1['D'],params1['E'],x_mod,y_mod) n1_mod = Function_N1(params1['A'],params1['E']) n2_mod = Function_N2(params1['A'],params1['E']) n3_mod = Function_N3(params1['A'],params1['E']) # RESIDUALS. x_res = x_data_1 - x_mod y_res = y_data_1 - y_mod z_res = z_data_1 - z_mod n1_res = n1_data_1 - n1_mod n2_res = n2_data_1 - n2_mod n3_res = n3_data_1 - n3_mod return np.concatenate((x_res.ravel(),y_res.ravel(),z_res.ravel(),n1_res.ravel(),n2_res.ravel(),n3_res.ravel())) params1 = Parameters() params1.add('fc',value= 1000,min=10,max=100000) params1.add('alpha',value=0.4,min=0.2,max=0.8) params1.add('A',value=20,max=30) params1.add('B',value=10,min=1,max=15) params1.add('C',value=15,max=20) params1.add('D',value=2.5,max=5) params1.add('E',value=5,min=2.5,max=7.5) res1 = minimize(FitFunction1,params1,kws={'x_data_1': x_data_1,'y_data_1': y_data_1,'z_data_1': z_data_1,'n1_data_1': n1_data_1,'n2_data_1': n2_data_1,'n3_data_1': n3_data_1}) print(fit_report(res1)) for keys in res1.params: exec(f'jf_{keys}_1 = res1.params[keys].value') x_computed_1 = Function_X(jf_A_1,jf_B_1,jf_C_1,jf_E_1) y_computed_1 = Function_Y(jf_A_1,jf_E_1) z_computed_1 = Function_Z(jf_A_1,jf_D_1,jf_E_1,Function_X(jf_A_1,jf_E_1),Function_Y(jf_A_1,jf_E_1)) 无法产生不受约束(没有数学约束)的相同FitFunction2

Y>Z>X

请注意,# FIT FUNCTION (CONDITION 2). def FitFunction2(params2,x_data_2=None,n1_data_2=None): # MODEL. x_mod = Function_X(params2['A'],params2['B'],params2['C'],params2['E']) n1_mod = Function_N1(params2['A'],params2['E']) # RESIDUALS. x_res = x_data_2 - x_mod n1_res = n1_data_2 - n1_mod return np.concatenate((x_res.ravel(),n1_res.ravel())) params2 = Parameters() params2.add('fc',max=100000) params2.add('alpha',max=0.8) params2.add('A',max=30) params2.add('B',max=15) params2.add('C',max=20) params2.add('D',max=5) params2.add('E',max=7.5) params2.add('X',value=np.mean(x_data_2),min=0,expr='C-B**2/(A-E)') params2.add('Z_minus_X',value=1,vary=True,min=0) params2.add('Y_minus_Z',min=0) params2.add('Z',expr='X + Z_minus_X',min=0)#,expr='(4*E*((A-E)*C-B**2))/(A*C-B**2)') params2.add('Y',expr='Z + Y_minus_Z',expr='4*(1/X+1/Y+1/D-B/((A-E)*C-B**2))**(-1)') res2 = minimize(FitFunction2,params2,kws={'x_data_2': x_data_2,'n1_data_2': n1_data_2}) print(fit_report(res2)) 中没有参数D。我试图引入另外五个约束来基于another question来强制FitFunction2,但是它不起作用。我知道Y>Z>X的结果不取决于当前配置中的参数FitFunction2XY。但是我不知道是否有一种方法可以使Z的结果以某种方式依赖于它们的另一种配置。

  • 是否可以在FitFunction2中排列参数ABCDE,以便{{1} }使用数学约束(或其他任何方法)?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res