2014-02-18 5 views
1

Здравствуйте, я пытаюсь использовать scipy.optimize.fmin для минимизации функции. Но все не так хорошо, потому что мои вычисления кажутся расходящимися, а не сходящимися, и я получил ошибку. Я попытался установить допуски, но он не работает. Вот мой код (Основная программа):Как использовать well scipy.optimize.fmin

import sys,os 
import numpy as np 
from math import exp 
import scipy 
from scipy.optimize import fmin 

from carlo import * 

A=real() 

x_r=0.11245 
x_i=0.14587 

#C=A.minim 
part_real=0.532 
part_imag=1.2 
R_0 = fmin(A.minim,[part_real,part_imag],xtol=0.0001) 

А класс:

import sys,os 
import numpy as np 
import random, math 
import matplotlib.pyplot as plt 
import cmath 
#import pdb 
#pdb.set_trace() 

class real: 
    def __init__(self): 
     self.nmodes = 4 
     self.L_ch = 1 
     self.w = 2 

    def minim(self,p): 

     x_r=p[0] 
     x_i=p[1] 
     x=complex(x_r,x_i) 
     self.a=complex(3,4)*(3*np.exp(1j*self.L_ch)) 
     self.T=np.array([[0.0,2.0*self.a],[(0.00645+(x)**2), 4.3*x**2]]) 
     self.Id=np.array([[1,0],[0,1]]) 
     self.disp=np.linalg.det(self.T-self.Id) 
     print self.disp 
     return self.disp 

Ошибка:

(-2.16124712985-8.13819476595j) 
/usr/local/lib/python2.7/site-packages/scipy/optimize/optimize.py:438: ComplexWarning: Casting complex values to real discards the imaginary part 
    fsim[0] = func(x0) 
(-1.85751684826-8.95377303768j) 
/usr/local/lib/python2.7/site-packages/scipy/optimize/optimize.py:450: ComplexWarning: Casting complex values to real discards the imaginary part 
    fsim[k + 1] = f 
(-2.79592712985-8.13819476595j) 
(-3.08484130014-7.36240080015j) 
(-3.68788935914-6.62639114029j) 
/usr/local/lib/python2.7/site-packages/scipy/optimize/optimize.py:475: ComplexWarning: Casting complex values to real discards the imaginary part 
    fsim[-1] = fxe 
(-2.62046851255e+87-1.45013007728e+88j) 
(-4.037931857e+87-2.2345341712e+88j) 
(-7.45017628087e+87-4.12282179854e+88j) 
(-1.14801242605e+88-6.35293780534e+88j) 
(-2.11813751435e+88-1.17214723347e+89j) 
Warning: Maximum number of function evaluations has been exceeded. 

На самом деле я не undersatnd, почему вычисление расходящихся , может быть, мне нужно использовать что-то другое вместо использования fmin для минимизации? У кого-то появилась идея? спасибо.

+0

Названия классов должны быть указаны с использованием CapWords - http://www.python.org/dev/peps/pep-0008/#class-names – IanAuld

+0

@IanAuld это руководство, а не закон. – M4rtini

+0

Вы возвращаете комплексные числа из целевой функции. Что означало бы минимизацию комплексного числа? Является ли 1 + 2j <2 + 1j, это>, или они равны? Fmin здесь принимает реальную роль - как вы видите, она красиво сводит к минимуму ее –

ответ

1

Попробуйте оптимизировать абсолютное значение вместо комплексного значения. Это принесло мне достойный результат.

f = lambda x: abs(A.minim(x)) 
R_0 = fmin(f,[part_real,part_imag],xtol=0.0001) 

Я думаю, fmin не работает хорошо со сложными значениями.