我试图使用Python2.7在数值上解决一个等式.这是整个代码:
from sympy import *
from sympy import Symbol
from sympy.solvers import nsolve
from scipy import *
from pylab import *
import numpy as np
# Symbols
theta = Symbol('theta')
phi = Symbol('phi')
phi0 = Symbol('phi0')
H0 = Symbol('H0')
# Constants
a = 0.05
b = 0.05**2/(8*pi*1e-7)
c= 0.001/(4*pi*1e-7)
phi0 = 60*pi/180
H0 = -0.03/(4*pi*1e-7)
def m(theta,phi):
return np.array([sin(theta)*cos(phi), sin(theta)*cos(phi), cos(phi)])
def h(phi0):
return np.array([cos(phi0), sin(phi0), 0])
def k(theta,phi,phi0):
return np.vdot(m(theta,phi),h(phi0))
def F(theta,phi,phi0,H0):
return -(a*H0)*k(theta,phi,phi0)+b*(cos(theta)**2)+c*(sin(2*theta)**2)+sin(theta)**4*sin(2*phi)**2
def F_phi(theta,phi,phi0,H0):
return simplify(diff(F(theta,phi,phi0,H0),phi))
def …Run Code Online (Sandbox Code Playgroud) 我对几天前写的帖子有一个跟进问题,谢谢你以前的反馈:
我现在已经在python中设置了设置的非线性方程,因此fsolve将独立处理实部和虚部.但是,仍然存在python"fsolve"收敛到正确解决方案的问题.我有完全相同的输入在Matlab中使用,经过双重检查后,方程组也完全相同.无论我如何设置初始值,Matlab都将始终收敛到正确的解决方案.但是,对于python,每个初始条件都会产生不同的结果,而不是正确的结果.在几分之一秒后,python会出现以下警告:
/opt/local/Library/Frameworks/Python.framework/Versions/Current/lib/python2.7/site-packages/scipy/optimize/minpack.py:227:
RuntimeWarning: The iteration is not making good progress, as measured by the
improvement from the last ten iterations.
warnings.warn(msg, RuntimeWarning)
Run Code Online (Sandbox Code Playgroud)
我想知道在python和Matlab中的fsolve之间是否存在一些已知的差异,以及是否有一些已知的方法来优化python中的性能.
非常感谢你
python matlab nonlinear-functions complex-numbers numerical-methods
在我以前的帖子,我一直在寻找关联性比率(η或η 2我被那没有人使用了线性的GLM程序检查η感到意外)例程R..
让我们从一个简单的例子开始:你如何检查双变量相关的线性?只有散点图?
有几种方法可以做到这一点,一种方法是比较线性和非线性模型R 2,然后应用F检验来寻找它们之间的显着差异.
最后,问题是:你如何检查线性,"非格式"方式?
我正在开发OpenGL中的可视化工具,以可视化3d有限元建模应用程序的输出.该应用程序使用四面体网格(但我只查看外部构面,即三角形).输出是一个标量变量,我想映射到一个颜色映射(我已经知道如何做到这一点).棘手的部分是每个单元格中变量的值由该单元格中坐标的多项式函数(我认为它是3阶,但尚未最终确定)给出.
在OpenGL中,如果我使用"平滑"着色模型,那么如果我创建一个多边形并给每个顶点一个不同的值,那么它将自动在顶点的值之间进行插值(线性),以便获得颜色值.在内部的点.但是这只是在每个单元格中给出一个线性函数,我希望它是我指定的非线性函数.有没有办法做到这一点?
(当然,一种解决方案是通过将每个单元格绘制成一个小得多的OpenGL多边形的组合来"手动"进行插值,这些多边形足够小,每个单元的颜色变化不大.但我想知道OpenGL本身是否有一个解决方案.)
我使用Levenberg-Marquardt算法来最小化6个参数的非线性函数.每次最小化我有大约50个数据点,但是我得不到足够准确的结果.我的参数相差几个数量级的事实是否非常重要?如果是,我应该在哪里寻找解决方案?如果不是,您在工作中遇到的LMA有哪些限制(可能有助于找到我的应用中的其他问题)?非常感谢您的帮助.
编辑:我想解决的问题是确定最佳转换T:
typedef struct
{
double x_translation, y_translation, z_translation;
double x_rotation, y_rotation, z_rotation;
} transform_3D;
Run Code Online (Sandbox Code Playgroud)
使3D点集合适合3D线条.详细地说,我有一组3D点的坐标和相应3D线的方程,这些坐标应该通过这些点(在理想情况下).LMA正在最小化变换的3D点到相应的3D线的距离的总和.变换函数如下:
cv::Point3d Geometry::transformation_3D(cv::Point3d point, transform_3D transformation)
{
cv::Point3d p_odd,p_even;
//rotation x
p_odd.x=point.x;
p_odd.y=point.y*cos(transformation.x_rotation)-point.z*sin(transformation.x_rotation);
p_odd.z=point.y*sin(transformation.x_rotation)+point.z*cos(transformation.x_rotation);
//rotation y
p_even.x=p_odd.z*sin(transformation.y_rotation)+p_odd.x*cos(transformation.y_rotation);
p_even.y=p_odd.y;
p_even.z=p_odd.z*cos(transformation.y_rotation)-p_odd.x*sin(transformation.y_rotation);
//rotation z
p_odd.x=p_even.x*cos(transformation.z_rotation)-p_even.y*sin(transformation.z_rotation);
p_odd.y=p_even.x*sin(transformation.z_rotation)+p_even.y*cos(transformation.z_rotation);
p_odd.z=p_even.z;
//translation
p_even.x=p_odd.x+transformation.x_translation;
p_even.y=p_odd.y+transformation.y_translation;
p_even.z=p_odd.z+transformation.z_translation;
return p_even;
}
Run Code Online (Sandbox Code Playgroud)
希望这个解释会有所帮助......
EDIT2:
一些示例性数据粘贴在下面.3D线由中心点和方向矢量描述.所有线的中心点都是(0,0,0),每个矢量的'uz'坐标等于1.方向矢量的'ux'坐标集:
-1.0986, -1.0986, -1.0986,
-1.0986, -1.0990, -1.0986,
-1.0986, -1.0986, -0.9995,
-0.9996, -0.9996, -0.9995,
-0.9995, -0.9995, -0.9996,
-0.9003, -0.9003, -0.9004,
-0.9003, -0.9003, -0.9003,
-0.9003, -0.9003, -0.8011,
-0.7020, -0.7019, -0.6028,
-0.5035, -0.5037, …Run Code Online (Sandbox Code Playgroud) 有没有办法让我的nls在非线性拟合时有0个残差?在我的数据中有一些情况,其中拟合应该有0错误,但是nls总是失败并且吐出错误.
谁能告诉我:
这是我的nls电话:
fit <- nls(y ~ ifelse(g, m1 * (x - x0) + y0, m2 * (x - x0) + y0),
start = c(m1 = -1, m2 = 1, y0 = 0, x0 = split),
algorithm = "port",
lower = c(m1 = -Inf, m2 = -Inf, y0 = -Inf, x0 = split),
upper = c(m1 = Inf, m2 = Inf, y0 = Inf, x0 = (split+1)),
data=data.frame(x,y))
Run Code Online (Sandbox Code Playgroud) 我试图重现Kostakis的纸张解决方案.在本文中,使用de Heligman-Pollard模型将删节死亡率表扩展为完整的生命表.该模型有8个参数必须安装.作者使用了改进的Gauss-Newton算法; 该算法(E04FDF)是NAG计算机程序库的一部分.Levenberg Marquardt不应该产生相同的参数集吗?我的代码或LM算法的应用有什么问题?
library(minpack.lm)
## Heligman-Pollard is used to expand an abridged table.
## nonlinear least squares algorithm is used to fit the parameters on nqx observed over 5 year intervals (5qx)
AGE <- c(0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70)
MORTALITY <- c(0.010384069, 0.001469140, 0.001309318, 0.003814265, 0.005378395, 0.005985625, 0.006741766, 0.009325056, 0.014149626, 0.021601755, 0.034271934, 0.053836246, 0.085287751, 0.136549522, 0.215953304)
## The start parameters for de Heligman-Pollard Formula (Converged set a=0.0005893,b=0.0043836,c=0.0828424,d=0.000706,e=9.927863,f=22.197312,g=0.00004948,h=1.10003)
## I …Run Code Online (Sandbox Code Playgroud) r nonlinear-functions nonlinear-optimization model-fitting levenberg-marquardt
我目前被分配了一项工作,我需要将 SAS 代码翻译成 R。我已经成功完成了 80%,现在我被困在使用 PROC NLIN 的部分。从我读到的,PROC NLIN 用于拟合非线性模型,我不确定代码是否真的这样做,因此,坚持如何在 R 中做到这一点。代码如下 -
proc nlin data=ds1 outest=estout;
parms ET= 0 f= 10.68;
E= f- R*(1-ET*M);
L = E*E;
model.like = sqrt(E*E);
by Name ;
run;
Run Code Online (Sandbox Code Playgroud)
样本数据如下——
Name M R
Anna 0.5456231 4.118197
Anna 0.5359164 4.240243
Anna 0.541881 3.943975
Anna 0.5436047 3.822222
Anna 0.5522962 3.58813
Anna 0.5561487 3.513195
Anna 0.5423374 3.666507
Anna 0.525836 3.715371
Anna 0.5209941 3.805572
Anna 0.5304675 3.750689
Anna 0.5232541 3.788292
Run Code Online (Sandbox Code Playgroud)
当我浏览 SAS 帮助中 PROC NLIN 的页面时,参数“模型”用于指定方程,但此处的代码没有模型方程。Model.like 是指定似然函数(第 4316 …
我想使用python解决风险平价问题。
风险平价是金融投资组合构建的经典方法。基本思想是确保每个资产的风险贡献相等。
例如,假设有 3 个资产,资产收益的协方差矩阵是已知的:
(var_11,var_12,var_13
var_12,var_22,var_23
var_13,var_23,var_33)
Run Code Online (Sandbox Code Playgroud)
我想为这些资产 (w1,w2,w3) 提出一个投资组合权重,以便:
w1+w2+w3=1
w1>=0
w2>=0
w3>=0
Run Code Online (Sandbox Code Playgroud)
每个资产的风险贡献等于:
w1^2*var_11+w1*w2*var_12+w1*w3*var_13
=w2^2*var_22+w1*w2*var_12+w2*w3*var_23
=w3^2*var_33+w1*w3*var_13+w2*w3*var_23
Run Code Online (Sandbox Code Playgroud)
我不确定如何使用 python 求解这些方程,任何人都可以对此有所了解吗?
Google Ceres Solver解决了有限的非线性边界约束最小二乘问题.
我可以使用非线性最小二乘解算器来找到非线性方程组的解吗?
来自维基百科:"最小二乘法是超定系统近似解的一种标准方法,即方程组中存在的方程式多于未知数."
现在,由于非线性方程的"正常"系统应该在超定系统的集合中(在未知数的未知数等于方程数的简并情况下),我可以推导出我可以使用非线性最小二乘求解器用于此目的?
这个问题来自于我必须使用Google Ceres Solver库,它似乎只提供非线性最小二乘法.