exponenta event banner

ssSetSolverNeedsReset

Попросите модуль Simulink сбросить решатель

Синтаксис

void ssSetSolverNeedsReset(SimStruct *S)

Аргументы

S

SimStruct представляет S-функциональный блок или модель Simulink ®.

Описание

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

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

Примечание

При использовании этого макроса для проблем производительности также следует использовать 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