2013-04-19 3 views
0

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

I = I01(exp((V-R*I)/(n1*vth))-1)+I02(exp((V-R*I)/(n2*vth))-1)

vth и R константы уже известны, так что я только хочу, чтобы достичь I01, I02, n1, n2. Проблема в том, что, как видите, я зависим от самого себя. Я пытался использовать набор инструментов для подбора кривой, но, похоже, он не работает с рекурсивными уравнениями.

Есть ли способ сделать панель инструментов для подгонки кривой к этому? А если нет, что я могу сделать?

+0

Функции 'I01' и' I02', или вы не оставили '*'? – craigim

+0

Почему вы просто не пытаетесь использовать алгоритм спуска градиента или метод наименьшего квадрата? – NKN

ответ

0

Нет, CFTB не может соответствовать таким рекурсивно определенным функциям. И ошибки в I, поскольку истинное значение I неизвестно для какой-либо точки, создадут вид ошибок в задаче переменных. Все, что у вас есть, являются «измеренными» значениями для I.

Проблема ошибок в I МОЖЕТ быть серьезной, поскольку любые ошибки в I или отсутствие соответствия, шум, проблемы модели и т. Д. Будут использоваться в само выражение. Затем вы подтверждаете эти неточные значения, что может привести к беспорядку.

Возможно, вы сможете использовать итеративный подход. Так что-то вроде

% 0. Initialize I_pred 
I_pred = I; 

% 1. Estimate the values of your coefficients, for this model: 
% (The curve fitting toolbox CAN solve this problem, given I_pred) 
I = I01(exp((V-R*I_pred)/(n1*vth))-1)+I02(exp((V-R*I_pred)/(n2*vth))-1) 

% 2. Generate new predictions for I_pred 
I_pred = I01(exp((V-R*I_pred)/(n1*vth))-1)+I02(exp((V-R*I_pred)/(n2*vth))-1) 

% Repeat steps 1 and 2 until the parameters from the CFTB stabilize. 

выше псевдо-код будет работать только тогда, когда ваши начальные значения являются хорошими, и не являются большие ошибки/шум в модели/данных. Даже в хороший день вышеупомянутый подход может не сходиться хорошо. Но я не вижу никакой надежды иначе.

0

Предполагая, что I01 и I02 являются переменными, а не функции, то вы должны установить эту проблему вот так:

a0 = [I01 I02 n1 n2]; 
MinFun = @(a) abs(a(1)*(exp(V-R*I)/(a(3)*vth))-1) + a(2)*(exp((V-R*I)/a(4)*vth))-1) - I); 

aout = fminsearch(a0,MinFun); 

Вычитая I и принимать абсолютное значение, точка, где обе стороны равны будут точка, где MinFun равна нулю (сведено к минимуму).

+0

Как я уже указывал, поскольку в выражении используются значения I, любые ошибки/шум/отсутствие соответствия им потенциально могут быть проблемой. Это может быть особенно плохо, поскольку экспоненты затем применяются к результату. Это НЕ будет решением наименьших квадратов. – 2013-04-19 18:33:50

+0

Вот почему я вычитал 'I' с обеих сторон. Вы пытаетесь найти значения регулируемых параметров, которые делают обе стороны уравнения равными. Вычитание «I» с обеих сторон и поиск значений, для которых результат равен нулю, математически эквивалентен поиску значений, которые делают обе стороны равными, рекурсивными или нет. Взятие абсолютного значения превращает его в задачу минимизации, делая 0 точкой минимума. Поскольку в данных есть шум, ваш результат будет не ровно 0, но он будет как можно ближе. – craigim

+0

SIGH. NO. Вычитание I с обеих сторон ничего не делает. Выражение все еще есть, я зарылся внутри него. Таким образом, любой шум в I будет STILL быть повышенным, и по-прежнему потенциально может быть проблемой. – 2013-04-19 18:57:44

Смежные вопросы