문제

나는 엄격한 ODE 시스템을 풀기 위해 Octave에서 OdePkg를 사용하고 있습니다.작성자: 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);

솔버는 시간 t(벡터)를 기준으로 종속 변수 Y를 행렬에 저장합니다.

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  ...   ...   ...

param에 매개변수를 맞춰서 결과 변수 Y가 참조 값에 가장 잘 맞도록 하고 싶습니다. 예:

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

어떤 Octave/Matlab(다른 언어도 가능) 루틴이 가능합니다. 다중 매개변수(최소 제곱/스플라인) 맞춤 수행?어떻게 가능합니까? 다양한 초기값에 대한 매개변수 세트 결합 Y0이 맞나요?당신이 나에게 몇 가지 힌트와 가능성을 제공할 수 있다면 기쁘겠습니다.

안부, 사이먼

도움이 되었습니까?

해결책

이것은 Scipy와 비교적 간단해야합니다. scipy.optimize.leastsq() 주어진 매개 변수 벡터에 대한 잔차 배열을 반환 해야하는 함수를 취합니다. 그것은 잔차의 사각형의 합을 최소화합니다. 초기 값이 다른 여러 데이터 세트를 처리하려면 각 데이터 세트마다 ODE를 한 번 실행하고 각 데이터 세트/실행 쌍의 잔차를 계산 한 다음 잔차 벡터를 함께 연결합니다. 다음은 대략적인 스케치입니다.

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,))

다른 팁

각 기능 y (t)를 장착해야한다는 것을 의미합니까? 이 경우 각 Yi 대 시간에 대한 임대 제곱 또는 스플라인 피팅은 제대로 작동합니다. 데이터를 보지 않고는 어느 것이 가장 좋을지 알 수 없습니다.

주어진 시점에 대해 YI의 모든 값에 곡선을 맞추고 시간이 지남에 따라 곡선이 진화하는 것을 보면 다른 독립 변수를 제시해야합니다.

업데이트 : 최소 제곱 피팅은 그것이 무엇인지 - 나는 권장 할 특정 루틴이 없습니다. Scipy에는 하나가 있습니다, 확실해. 더 나은 추천이 없어서 죄송합니다. 나는 지금 단지 Python을 배우고 있습니다.

"피트니스 표시기"가 무엇을 의미하는지 모르겠습니다. 최소 제곱 피팅은 각 지점에서 적합과 데이터 사이의 오차 평균 제곱을 최소화하는 계수를 계산합니다.

여러 데이터 세트를 단일 맞춤으로 결합하는 한 가지 방법입니다. 병합하고 계산을 다시 실행하십시오.

저는 여러 실험 데이터 세트에 ODE의 매개변수와 초기 값을 맞추는 포괄적인 Matlab 도구 상자를 개발했습니다.각 실험에 따라 다른 초기값을 처리할 수 있으며 다음에서 사용할 수 있습니다. www.potterswheel.de.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top