Алгоритм концентрации витамина D - проблема с написанием алгоритма на основе формул - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь реализовать в Matlab алгоритм, который вычисляет концентрацию витамина D в крови на основе некоторых формул из статьи. Основная формула: C(t)

, где: - T - день года, для которого измеряется концентрация; - А является постоянным для простейшего измерения, описанного в журнале - E (пребывание на солнце в определенный месяц в году) приведено в статье - R (концентрация витамина D после однократного воздействия солнечного света) может быть рассчитана по формуле

R(t)

где F, альфа, бета - константы, t - день.

Автор статьи писал, что после расчета концентрации по формуле C (t) он прибавлял постоянное значение 33 каждый день.

Формула для R (t) проста, и моя диаграмма такая же, как в статье, но у меня проблема с формулой для вычисления C (t).

Это мой код:

function [C] = calculateConcentration(A,E,T,R)

C=zeros(1,T);
C(1) = E(1)*A*R(1);

month=1;

for i=2:(T)

    for j=1:i
        if mod(j,30)==0 && month<12
            month=month+1;
        end
    C(i) = C(i)+E(month)*A*R(T-j+1);
    end
    month=1;

end

for i=1:T
   C(i)=C(i)+33; 
end

end

Вот мой график: myChart

Вот график из статьи:

chartFromArticle

Итак, у меня две проблемы с этим графиком. Во-первых, самые большие значения на моем графике меньше значений на графике из статьи, а во-вторых, мой график постоянно растет.

Большое спасибо заранее помогите.

[РЕДАКТИРОВАТЬ] Я присоединяю значения всех констант и функцию для вычисления R (t).

function [R]= calculateR(T)

R = zeros(1,T);
F = 13;
alpha = 30;
beta = 3;

    for i=1:T
        R(i)=F*(2.^(-i/alpha)-2.^(-i/beta));
    end

end

A=0.1;
T=365;

R = calculateR(T);
E = [0.03, 0.06, 0.16, 0.25, 0.36, 0.96, 0.87, 0.89, 0.58, 0.24, 0.08, 0.02];

plot(1:T,R)

C = calculateConcentration(A,E,T,R);

figure; plot(1:T,C);

1 Ответ

0 голосов
/ 11 ноября 2018

Форматирование кода ужасно в комментариях, поэтому публиковать это как ответ. Я заявил, что я думаю (!) Является основной проблемой с вашим кодом в комментариях. Кумулятивные суммы могут очень быстро запутаться, поэтому зачастую лучше написать их более явно.

Я бы написал функцию так:

function C = calculateConcentration(T, E, A, R)

c = zeros(1, T);

% compute contribution of each individual day 
for t = 1:T
c(t) = E(mod(floor(t / 30), 12) +1) * A * R(t);
end

% add offset
c(1) = c(1) + 33;

C = cumsum(c);
end

Отказ от ответственности: я не писал ни одного кода Matlab в течение многих лет и не установил его на этом компьютере, поэтому обязательно проверьте это.

EDIT

Не уверен, что автор пишет то, что вы говорите, он пишет. Если вы выбрали A равным 100 (это может быть хорошо при правильном выборе единиц), примените смещение c(1) ко всем значениям c (в моей реализации), на самом деле не берите накопительную сумму , но вместо этого верните (в нижнем регистре) c, а затем выводите данные только из средней точки каждого месяца, после чего вы получите следующий график:

enter image description here

Тем не менее, стоит отметить, что если вы строите все точки данных, вы получаете следующее.

enter image description here

По номинальной стоимости я бы сказал, что тот, кто придумал эту модель, полон БС. Но более точный ответ потребует внимательного прочтения статьи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...