scipy.optimize.minimize
デフォルトメソッドを使用すると、エラーまたは警告メッセージなしで結果として初期値が返されます。 this answerにより示唆されるようネルダー・ミードの方法を使用して問題を解決するが、私は理解したいと思います:んスカイフィールドで移動せずにscipy.optimize.minimize(デフォルト)が成功を報告するのはなぜですか?
は、デフォルトの方法は、答えとして出発点を警告なし間違った答えを返すのはなぜ - とあります私はを "警告なしで間違った答え"から守ることができますこの場合、この現象は避けてください。
注意、機能separation
は、シンプレックスがここに優れている理由とすることができる、滑らかで保証されていない最小化する値を生成するためのpythonパッケージSkyfieldを使用しています。
結果:
試験結果:[2.14159739] '正しい':初期2.14159265359:0.0
既定の結果:[] '正しい':13054初期:
ネルダ - ミードの結果:[13053.81011963] '正しい':初期:ここ
FULL OUTPUT using DEFAULT METHOD:
status: 0
success: True
njev: 1
nfev: 3
hess_inv: array([[1]])
fun: 1694.98753895812
x: array([ 10000.])
message: 'Optimization terminated successfully.'
jac: array([ 0.])
nit: 0
FULL OUTPUT using Nelder-Mead METHOD:
status: 0
nfev: 63
success: True
fun: 3.2179306044608054
x: array([ 13053.81011963])
message: 'Optimization terminated successfully.'
nit: 28
10000がいっぱいスクリプトは次のとおりです。
def g(x, a, b):
return np.cos(a*x + b)
def separation(seconds, lat, lon):
lat, lon, seconds = float(lat), float(lon), float(seconds) # necessary it seems
place = earth.topos(lat, lon)
jd = JulianDate(utc=(2016, 3, 9, 0, 0, seconds))
mpos = place.at(jd).observe(moon).apparent().position.km
spos = place.at(jd).observe(sun).apparent().position.km
mlen = np.sqrt((mpos**2).sum())
slen = np.sqrt((spos**2).sum())
sepa = ((3600.*180./np.pi) *
np.arccos(np.dot(mpos, spos)/(mlen*slen)))
return sepa
from skyfield.api import load, now, JulianDate
import numpy as np
from scipy.optimize import minimize
data = load('de421.bsp')
sun = data['sun']
earth = data['earth']
moon = data['moon']
x_init = 0.0
out_g = minimize(g, x_init, args=(1, 1))
print "test result: ", out_g.x, "'correct': ", np.pi-1, "initial: ", x_init # gives right answer
sec_init = 10000
out_s_def = minimize(separation, sec_init, args=(32.5, 215.1))
print "default result: ", out_s_def.x, "'correct': ", 13054, "initial: ", sec_init
sec_init = 10000
out_s_NM = minimize(separation, sec_init, args=(32.5, 215.1),
method = "Nelder-Mead")
print "Nelder-Mead result: ", out_s_NM.x, "'correct': ", 13054, "initial: ", sec_init
print ""
print "FULL OUTPUT using DEFAULT METHOD:"
print out_s_def
print ""
print "FULL OUTPUT using Nelder-Mead METHOD:"
print out_s_NM
[関連するSkyfield](http://stackoverflow.com/q/36111098/3904031)の質問があります。 – uhoh
ああ、申し訳ありませんが、それを逃した。私は問題は、デフォルトあたりの 'minim'があなたの関数を円滑にするアルゴリズムを使用していることです。あなたの機能がスムーズでない場合、あなたはガーベジ・イン・ゴミ出しの状況になります。 – cel
あなたが何を求めているのか分かりません。あなたの関数が滑らかでない場合、デフォルトのアルゴリズムは問題に適していません。なぜあなたはそれを使いたいのですか?あなたは機能がスムーズであるかどうかを調べる方法を尋ねていますか? – cel