recursivas funciones recursion sas sas-macro

recursion - funciones recursivas c++



Implementando bisección recursiva en SAS (2)

No estoy seguro de qué hace su macro% nextint, pero escribí algo solo para mostrar cómo se ejecutará la macro% iter.

Debes poner esas llamadas symput en un paso de datos.

Usé null aquí solo para obtener nuevos valores para las variables macro a0 y b0 del conjunto de datos de intervalo.

Tenga en cuenta que esto producirá el conjunto de datos de intervalo con el primer conjunto de valores para a y b donde b - a es menor que 0.0001.

Las sentencias% put al final de la macro le mostrarán los valores cambiantes de ayb para cada interacción.

%macro nextint(a1,b1); data interval; a = &a1. + 0.1; b = &b1. - 0.1; run; %mend; %macro iter(a,b); %let a0 = &a.; %let b0 = &b.; %do %while(%sysevalf(%sysevalf(&b0. - &a0.) > 0.0001)); %nextint(&a0,&b0); data _null_; set interval; call symput(''a0'',strip(a)); call symput(''b0'',strip(b)); run; %put &a0.; %put &b0.; %put %sysevalf(&b0. - &a0.); %end; %mend; %iter(0,1);

Primera pregunta aquí.

Básicamente, quiero implementar un algoritmo de bisección recursivo en SAS mediante el uso de macros. Ya he escrito una macro que toma dos argumentos (los puntos finales inferior y superior del intervalo actual) y produce una tabla que contiene los dos puntos finales de otro intervalo. El problema que tengo es escribir una macro que iterará este proceso hasta que el ancho del intervalo esté por debajo de un cierto umbral.

Esto es lo que tengo hasta ahora, pero el código no funciona como esperaba. Tenga en cuenta que el 99% de todo lo que he aprendido sobre SAS, lo aprendí en los últimos tres días más o menos. ¡Muchas gracias a cualquiera que pueda ayudar!

data interval; input a b; datalines; 0 1 ; run; %macro iter(a,b); data rec; set interval; %let a0 = &a; %let b0 = &b; %do %while(%sysevalf(&b0 - &a0) > .00001); %nextint(&a0,&b0); call symput(''a0'',trim(left(a))); call symput(''b0'',trim(left(b))); %end; run; %mend;

donde %nextint(&a0,&b0) produce un interval tabla con una observación, y dos columnas a y b con los valores calculados a partir de &a0 y &b0 . Como pueden ver, SAS es un completo misterio para mí y no sé lo que estoy haciendo.


Sugeriría que estudies la sintaxis de SAS / IML para hacer un trabajo de análisis numérico.

Este blog de Rick Wicklin explica cómo puedes usar SAS / IML para encontrar la raíz de una función.

Si aún desea utilizar macros y el paso de datos, puede usar las options mprint; declaración para depurar su código y ver en el registro qué comandos se ejecutan realmente.