I know you posted this question a long time ago, but I just wrestled with this problem, and the "solution" I came works like this:
Students will be required to use C for the arbitrary constant, and C should be added as a variable to the context.
Next suppose "the" answer is:
$answer = Formula("1/(x+C)");
which is the solution to
y' = -y^2
Make a custom answer checker that checks for two things:
1. the student's answer solves the differential equation
2. whatever the student has entered in place of C is a linear (and nonconstant) function of C
I probably do not have the most efficient way to do this, but my custom checker works like this:
ANS( $answer->cmp( checker=>sub {
my ( $correct, $student, $ansHash ) = @_;
my $dstudent = $student->D('x');
my $lhs = Formula("$dstudent");
my $rhs = Formula("-($student)^2");
my $studentC = Formula("1/$student - x");
my $dstudentC = $studentC->D('C');
my $ddstudentC = $dstudentC->D('C');
if (($lhs == $rhs) && ($ddstudentC == Formula("0")))
{ if ($dstudentC != Formula("0"))
{return 1}
else {Value->Error("Your answer is not the most general solution.")}
}
else {return 0};
} ) );
This lets students enter things like 1/(x+2C-5), if that happens to be where they ended up after solving process. There is a check in there that prevents things like 1/(x+5) from being counted as correct too. Ideally, the checker would allow 1/(x+f(C)) for any one-to-one function f that covers R, but I don't know how to check that. Looking at first and second derivatives lets us check linearity though.
Take care if you use this in problems where the answer has domain issues.