Pergunta

Eu estou usando OdePkg em Octave para resolver um sistema de equações diferenciais ordinárias rígidos, por exemplo, por ode5r:

function yprime = myODEs(t,Y,param)
    yprime = [
        - param(1) * Y(1);                      # ODE for Y(1)
        param(1) * Y(1) - param(2) Y(2) * Y(3); # ODE for Y(2)
        param(2) Y(2) * Y(3)                    # ODE for Y(3)
                                                # etc.
];

time_span = [1, 24]         # time span of interest
Y0        = [1.0, 1.1, 1.3] # initial values for dependent variables Y
param     = [7.2, 8.6, 9.5] # parameters, to be optimized

[t, Y] = ode5r(@myODEs, time_span, Y0, ..., param);

As lojas solver as variáveis ??dependentes Y em uma matriz em relação ao tempo t (vector):

t     Y(1)  Y(2)  Y(3)
0.0   1.0   1.1   1.3
0.1   ...   ...   ...
0.5   ...   ...   ...
0.9   ...   ...   ...
...   ...   ...   ...
4.0   ...   ...   ...
...   ...   ...   ...
24.0  ...   ...   ...

Eu quero encaixar os parâmetros param, de modo que as variáveis ??resultantes Y melhor atender meus valores de referência, por exemplo:.

t         Y(1)  Y(2)  Y(3)
0.5       1.1   N/A   N/A
1.0       1.9   N/A   N/A
4.0       2.3   2.7   2.1
5.0       N/A   2.6   2.2
24.0      0.9   1.5   2.0

Qual Octave / Matlab (outras línguas são bem-vindos) executar uma multi-parâmetro (menos quadrado / ranhura) ajuste rotina pode ? Como é possível combinam conjuntos de parâmetros para diferentes valores iniciais Y0 no ajuste? Eu ficaria feliz se você poderia me fornecer algumas dicas e possibilidades.

Com os melhores cumprimentos, Simon

Foi útil?

Solução

Isto deve ser relativamente simples com scipy. scipy.optimize.leastsq() toma uma função que deve retornar uma matriz de resíduos para um dado vector de parâmetros. Ele irá minimizar a soma dos quadrados dos resíduos. Para lidar com múltiplos conjuntos de dados com diferentes valores iniciais, basta executar o ODE uma vez para cada conjunto de dados, calcular os resíduos para cada conjunto de dados par / run, e então concatenar os vetores residuais juntos. Aqui está um esboço:

import numpy
from scipy import integrate, optimize

# The initial guess.
p0 = numpy.array([7.2, 8.6, 9.5])

# The collected datasets.
# A list of (t, y0, y) tuples.
# The y's are all (len(y0), len(t))-shaped arrays. The output of
# integrate.odeint is also in this format.
datasets = [...]

def odes(y, t, params):
    dydt = [
        -params[0] * y[0],
        params[0]*y[0] - params[1]*y[1]*y[2],
        params[1]*y[1]*y[2],
    ]
    return np.array(dydt)

def residuals(params, datasets):
    res = []
    for t, y0, y in datasets:
        res.append(integrate.odeint(odes, y0, t, args=(params,)) - y)

    # Stack them horizontally and flatten the array into the expected vector.
    # You're on your own for handling missing data. Look into the numpy.ma
    # module.
    all_residuals = numpy.hstack(res).ravel()
    return all_residuals

opt_params, err = optimize.leastsq(residuals, p0, args=(datasets,))

Outras dicas

Você quer dizer que cada função y (t) precisa ser instalado? Nesse caso, um contrato de arrendamento quadrados ou montagem para cada conjunto de Yi versus tempo ranhura vai funcionar muito bem. não pode dizer qual deles seria melhor sem ver os seus dados.

Você vai ter que vir para cima com uma outra variável independente se você quer dizer que você quer caber uma curva em todos os valores de Yi para um determinado ponto de tempo e depois ver que a curva de evoluir ao longo do tempo.

UPDATE: Pelo menos encaixe quadrado é o que é - Eu não tenho uma rotina especial para recomendar. SciPy tem uma , tenho certeza. Lamento que eu não tenho uma recomendação melhor. Eu só estou aprendendo Python agora.

Eu não sei o que você quer dizer com "indicador de fitness". Mínimos quadrados correspondentes ao cálculo de coeficientes que minimizam o quadrado médio do erro entre a forma e os dados em cada ponto.

Apenas uma maneira de combinar vários conjuntos de dados em um único ajuste:. Fundi-los e re-executar o cálculo

Eu desenvolvi uma caixa de ferramentas Matlab abrangente para parâmetros de ajuste e valores iniciais de ODEs para múltiplos conjuntos de dados experimentais. Ele pode lidar com valores iniciais diferentes, dependendo de cada experiência e está disponível em www.potterswheel.de .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top