我在通过Scipy&Numpy将我的MATLAB代码翻译成Python时遇到了一些麻烦.我坚持如何找到我的ODE系统的最佳参数值(k0和k1),以适应我的十个观察数据点.我目前对k0和k1有一个初步猜测.在MATLAB中,我可以使用一种叫做"fminsearch"的东西,它是一个接受ODE系统,观察数据点和ODE系统初始值的函数.然后,它将计算一对新的参数k0和k1,它们将适合观察到的数据.我已经包含了我的代码,看看你是否可以帮助我实现某种"fminsearch"来找到适合我数据的最佳参数值k0和k1.我想将任何代码添加到我的lsqtest.py文件中.
我有三个.py文件 - ode.py,lsq.py和lsqtest.py
ode.py:
def f(y, t, k):
return (-k[0]*y[0],
k[0]*y[0]-k[1]*y[1],
k[1]*y[1])
Run Code Online (Sandbox Code Playgroud)
lsq.py:
import pylab as py
import numpy as np
from scipy import integrate
from scipy import optimize
import ode
def lsq(teta,y0,data):
#INPUT teta, the unknowns k0,k1
# data, observed
# y0 initial values needed by the ODE
#OUTPUT lsq value
t = np.linspace(0,9,10)
y_obs = data #data points
k = [0,0]
k[0] = teta[0]
k[1] = teta[1]
#call the ODE solver to get the states:
r = …Run Code Online (Sandbox Code Playgroud) 我所做的是将两个线性函数拟合到我的数据中.我知道如何选择各种拟合函数的数据.我的问题是我希望拟合的线只是在一定的间隔内绘制.我到现在为止做了什么:
f(x) = a*x + b; fit [800:1250][-2:8] f(x) 'Daten.txt' u 1:2 via a,b
g(x) = c*x + d; fit [1258:1650][-2:8] g(x) 'Daten.txt' u 1:2 via c,d
plot "Daten.txt" u 1:2 w l, f(x) t title_f(a,b), g(x) t title_g(c,d)
Run Code Online (Sandbox Code Playgroud)
它导致了
一张图片我不允许发布...
我怎样才能使绿色fittin-line仅从800-1200开始,蓝色装配线从1100-end开始?
我试图将已知的明确定义的形状(例如,盒子,圆柱体;具有可配置的位置,旋转和尺寸)拟合到一组点,这些点具有通过采样3D网格生成的法线。我当前的方法是为每个形状定义自定义拟合函数,并将其传递给第三方优化函数:
fitness = get_fitness(shape_parameters, points)
best_parameters = external.optimise(get_fitness, initial_parameters, points)
Run Code Online (Sandbox Code Playgroud)
(作为参考,我目前正在使用Python 3并scipy.optimize.minimize带有边界,但是语言无关紧要)。
矩形的适应度函数看起来像
def get_fitness(parameters, points):
side_fitnesses = []
for side in [top, right, bottom, left, back, front]:
dists = get_side_distances(parameters, points, side)
ndevs = get_side_normal_deviations(parameters, points, side)
side_fitnesses.append(combine_dists_and_ndevs(dists, ndevs))
fitnesses = choose_best_side_for_each_point(side_fitnesses)
return mean(fitnesses)
Run Code Online (Sandbox Code Playgroud)
但是,这意味着我必须确定异常值(有/没有缓存),并且一次只能拟合一个形状。
例如(在2D中),对于这些点(具有法线),我想要以下结果:
请注意,返回了多个形状,并且忽略了异常值。通常,输入数据中可以有许多,一种或零种形状。后处理可以删除无效(例如,太小)的结果。
注意:我真正的问题是3D。我具有真实世界对象的3D网格表示的片段,这意味着我除了上面的示例中的点/法线(例如面部区域和连接性)外,还具有更多信息。
进一步阅读:
PS:我不确定StackOverflow是否是此问题的最佳StackExchange网站
我很难理解为什么我将高斯拟合到一组数据(ydata)时无法正常工作,如果我将与该数据相对应的x值的间隔(xdata1到xdata2)移开了。高斯写为:
其中A只是一个振幅因子。更改数据的某些值,很容易使其适用于两种情况,但是也可以轻松地找到不适用于这些情况以及xdata1未估计参数协方差的情况。我scipy.optimize.curve_fit在Windows 7上的Python 3.7.1中的Spyder中使用。
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
xdata1 = np.linspace(-9,4,20, endpoint=True) # works fine
xdata2 = xdata1+2
ydata = np.array([8,9,15,12,14,20,24,40,54,94,160,290,400,420,300,130,40,10,8,4])
def gaussian(x, amp, mean, sigma):
return amp*np.exp(-(((x-mean)**2)/(2*sigma**2)))/(sigma*np.sqrt(2*np.pi))
popt1, pcov1 = curve_fit(gaussian, xdata1, ydata)
popt2, pcov2 = curve_fit(gaussian, xdata2, ydata)
fig, ([ax1, ax2]) = plt.subplots(nrows=1, ncols=2,figsize=(9, 4))
ax1.plot(xdata1, ydata, 'b+:', label='xdata1')
ax1.plot(xdata1, gaussian(xdata1, *popt1), 'r-', label='fit')
ax1.legend()
ax2.plot(xdata2, ydata, 'b+:', label='xdata2')
ax2.plot(xdata2, …Run Code Online (Sandbox Code Playgroud) 我想将lorentzian峰值拟合到一组数据x和y,数据很好.像OriginLab这样的其他程序非常适合它,但我想用python自动化,所以我有以下代码,它基于http://mesa.ac.nz/?page_id=1800
我遇到的问题是scipy.optimize.leastsq返回最适合我传递给它的相同初始猜测参数,基本上什么都不做.这是代码.
#x, y are the arrays with the x,y axes respectively
#defining funcitons
def lorentzian(x,p):
return p[2]*(p[0]**2)/(( x - (p[1]) )**2 + p[0]**2)
def residuals(p,y,x):
err = y - lorentzian(x,p)
return err
p = [0.055, wv[midIdx], y[midIdx-minIdx]]
pbest = leastsq(residuals, p, args=(y, x), full_output=1)
best_parameters = pbest[0]
print p
print pbest
Run Code Online (Sandbox Code Playgroud)
p是初始猜测,best_parameters是来自leastsq的返回"最佳拟合"参数,但它们始终相同.
这是full_output = 1返回的内容(长数字数组已被缩短,但仍然代表)
[0.055, 855.50732, 1327.0]
(array([ 5.50000000e-02, 8.55507324e+02, 1.32700000e+03]),
None, {'qtf':array([ 62.05192947, 69.98033905, 57.90628052]),
'nfev': 4,
'fjac': array([[-0., 0., 0., 0., 0., 0., 0.,],
[ …Run Code Online (Sandbox Code Playgroud) 我有一个在网格上有矩形数据的numpy数组,并希望在它上面插入二维样条来重现大规模变化,同时消除所有/大部分噪声.数据还有一些区域标记为NaN值无效.
我尝试使用scipy.interpolate.RectBivariateSpline函数,但是差距搞砸了结果.所以我尝试使用同一个包中的LSQBivariateSpline函数,希望当我将所有NaN像素的权重设置为0时,它会简单地忽略它们.但是,当我遇到以下错误时,我不知道如何避免:
我的代码是:
# some preparation, loading data and stuff
# all my data is stored in 'data'
# Create the knots (10 knots in each direction, making 100 total
xcoord = numpy.linspace(5, data.shape[0]-5, 10)
ycoord = numpy.linspace(5, data.shape[1]-5, 10)
# Create all weights, and set them to 0 when the data is NaN
weights = numpy.ones(data.shape)
weights[numpy.isnan(data)] = 1e-15 # weights must be >0
# LSQBivariateSpline needs x and y coordinates as 1-D arrays
x, y = numpy.indices(data.shape)
spline_fit …Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用一些功能来使用某些数据,scipy.optimize.curve_fit但我确实遇到了困难.我真的看不出为什么这不起作用的原因.
# encoding: utf-8
from __future__ import (print_function,
division,
unicode_literals,
absolute_import,
with_statement)
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as mpl
x, y, e_y = np.loadtxt('data.txt', unpack=True)
def f(x, a, k):
return (1/(np.sqrt(1 + a*((k-x)**2))))
popt, pcov = curve_fit(f, x, y, maxfev = 100000000)
mpl.plot(x, f(x, *popt), 'r-', label='Fit')
mpl.plot(x, y, 'rx', label='Original')
mpl.legend(loc='best')
mpl.savefig('curve.pdf')
print(popt)
# correct values which should be calculated
# a=0.003097
# k=35.4
Run Code Online (Sandbox Code Playgroud)
这是由上层代码生成的情节图像:

data.txt:
#x y e_y
4.4 0.79 0.13 …Run Code Online (Sandbox Code Playgroud) 一个简单的问题-使用set xrange [x_min:x_max]命令可以更改在绘图上绘制的范围。
使用gnuplot中的数据拟合工具拟合函数时,此命令是否还会限制使用的范围?有没有办法手动指定用于函数拟合的范围?(可能是该命令的一个猜测every?我是否需要超越xrange使用every?)
我问的原因是我正在使用xrange绘制放大到低值x区域的输出以更清楚地查看瞬态行为,但是我认为这可能是在xrange之外的较大x值处“切出”函数的值选择的地区?
如何拟合xy deltax delta y之类的数据?我必须对两个轴的误差进行线性拟合加权,确切的语法是什么?
适合f (x) "file.txt" u1:2:3:4通过a,b有xyerrorbars。
f (x) =a*x + b
Run Code Online (Sandbox Code Playgroud)
结果:invert_RtR中的奇异矩阵
我收集了一些数据来分析加速度随时间的变化。但是当我编写下面的代码以很好地拟合正弦波时,结果就是这样。这是因为我没有足够的数据还是我在这里做错了什么?
在这里你可以看到我的图表:
直接绘制测量结果(不适合)
适合水平和垂直移动(curve_fit)
linspace 增加数据
手动操纵幅度
编辑:我通过使用 linspace 函数并绘制它来增加数据大小,但我不确定为什么幅度不匹配,是因为需要分析的数据很少吗?(我能够手动操纵幅度,但我不明白为什么它不能做到这一点)
我用于拟合的代码
def model(x, a, b):
return a * np.sin(b * x)
param, parav_cov = cf(model, time, z_values)
array_x = np.linspace(800, 1400, 1000)
fig = plt.figure(figsize = (9, 4))
plt.scatter(time, z_values, color = "#3333cc", label = "Data")
plt.plot(array_x, model(array_x, param[0], param[1], param[2], param[3]), label = "Sin Fit")
Run Code Online (Sandbox Code Playgroud)