ssSetSolverNeedsReset

Попросите механизм Simulink сбросить решатель

Синтаксис

void ssSetSolverNeedsReset(SimStruct *S)

Аргументы

S

SimStruct, представляющий блок S-Function или Simulink® модель.

Описание

Используйте ssSetSolverNeedsReset макрос, когда происходит изменение в динамике S-функции, которое может повлиять на решатель ОДУ. Примером изменения является разрыв в непрерывном состоянии S-функции или разрыв в его выходе, который управляет другими непрерывными блоками. S-функция должна изменять свой непрерывный вектор состояния только в основном временном шаге. Не изменяйте значения непрерывного состояния в незначительных временных шагах.

Разрыв в состоянии или выходе непрерывной S-функции может сделать недействительными кэшированное состояние и информацию производной в решателе ОДУ. Используйте ssSetSolverNeedsReset макрос, чтобы решатель ОДУ повторно инициализировал кэшированную информацию на следующем шаге интегрирования. Непрерывные изменения состояния без сбросов решателя небезопасны. Изменение непрерывных состояний без использования ssSetSolverNeedsReset макрос может привести к неправильным результатам, поскольку решатель ОДУ может игнорировать эти изменения для защиты внутренней согласованности своих данных и результатов интегрирования. Только инициализируйте состояния в основные временные шаги. Алгоритмы интегрирования не ожидают изменения векторов состояния в течение незначительных временных шагов.

Примечание

При использовании этого макроса, для эффективности проблем, рассмотрите также использование ssSetSkipContStatesConsistencyCheck(S,1) в mdlInitializeSizes способ. ssSetSkipContStatesConsistencyCheck отключает мониторинг непрерывных состояний S-функции со стороны Simulink, улучшая эффективность симуляции.

Примечание

Когда симуляция многопоточна, она пропускает сброс решателя и игнорирует использование этого макроса.

Языки

C, C++

Пример

Следующий пример использует этот макрос, чтобы попросить механизм Simulink сбросить решатель.

static void mdlOutputs(SimStruct *S, int_T tid) 
{ 
	: 
	: <snip> 
	: 
	if ( ssIsMajorTimeStep(S) && YourConditionsForStateChange ) {
		double *x = ssGetContStates(S);
		/* reset the states */ 
		for (i=0; i<nContStates; i++) { 
			x[i] = 0.0; 
		} 
		/* Ask the Simulink engine to reset the solver. */ 
		ssSetSolverNeedsReset(S); 
	}
}

Также см. исходный код изменяющейся во времени непрерывной передаточной функции (stvctf.c) для примера, где и как использовать этот макрос.

Представлено до R2006a