0

関数に合わせて lsqcurvefit を使用します。私の機能は次のとおりです。

C_PET (t)=(k_1/(α_2+α_1 ) [(k_3+k_4-α_1 )  e^((-α_1   t) )+(α_2-k_3-k_4 ) e^((-α_2   t) ) ]* C_P (t))+vC_b (t)

私は解決策を見つけに行きました。つまり、私の K パラメーターに最適です。問題は、私のコードが与える解決策が最初のポイントであることです。これはコードです(vbは定数、cp、ydata、tはベクトルです

    k0 = 1*ones(1,4);
    k0(4) = 0;
    k0 = [0.8,0.1,0.5,0.07]
    a1=[k0(2)+k0(3)+k0(4)+sqrt(((k0(2)+k0(3)+k0(4)).^2) -4*k0(2)*k0(4))]/2;
    a2=[k0(2)+k0(3)+k0(4)-sqrt(((k0(2)+k0(3)+k0(4)).^2) -4*k0(2)*k0(4))]/2;
    l1=(k0(1)/(a2+a1))*(k0(3)+k0(4)-a1) l2=(a2-k0(3)-k0(4))
    l2=(a2-k0(3)-k0(4))
     y=conv((l1*exp(-a1*t)+l2*exp(-a2*t)),cp);

    y=(y(1:numel(t)));
    CPET=@(k,t) y+(vb*cp);
    [xfitted,errorfitted] = lsqcurvefit(CPET,k0,t,ydata)

%

ですから、私を助けてください。

4

1 に答える 1

1

あなたの目的関数CPETは定数です:

CPET=@(k,t) y+(vb*cp);

kあなたはそれをandの関数として宣言しましたtyvbno もcpchange whenkもchange も宣言しませんでしたt。それが、ソルバーが答えを変えていない理由です。kまたはの値に関係なくt lsqcurvefitCPET答えは常に同じです。これは間違っています。

あなたの目的関数は非常に長いので、もっと単純なものを考えてみましょう。たとえば、次のような別の項として別の関数を持つ二次モデルを当てはめますt(つまり、あなたのC_P作品と同じ方法で):

O = k 1 + k 2 *t + k 3 *t 2 + CP (t)

この目的関数をlsqcurvefitdo が期待する形式に書き込むには、次のようにします。

O = @(k,t) k(1) + k(2).*t + k(3).*t.^2 + CP(t)

が常に自然数であるCP場合に限り、上記のベクトル、CP を使用できます。ただし、入力として受け取るt関数という関数を作成する方がはるかに理にかなっています。たとえば、おそらくすべてのことは、その後のサインを取ることですCPtCPt

CP = @(t)sin(t);  %// This needs to be declared before O

類似性をandCPETの関数として記述する必要があり、その定義でandの両方を使用する必要があります。ktkt

于 2016-02-19T12:01:28.527 に答える