This is a very simple page, put in only because my experience as an undergraduate was that nobody ever quite stopped and said what `well-defined' meant. When something wasn't well-defined, I could sort of see that there was a problem, but I couldn't quite put my finger on what the problem was in general terms.
In later years, I have discovered that this is quite a common experience. There is something about the word that causes it to slip through the net. (Another example is the word `characterize'. It took me a long time to understand that characterizing a mathematical concept C meant nothing more than proving a theorem of the form x is C if and only if ...)
Now, of course to say, after you appear to have defined x, that x isn't well-defined is to say that there was something unsatisfactory about the apparent definition. What can be puzzling is that this situation often seems to be on the verge of happening. Why do mathematicians frequently flirt with danger, giving a definition and then saying, `Now we must check that this is well-defined.'? Couldn't one just give a decent definition to start with?
The answer is no, for a very good reason. It frequently happens that one would like to define a function f as a composition of two objects g and h (so f=gh - do h first then g) where g is a perfectly decent function but h is that object whereof one dare not speak: a multivalued function. What is a multivalued function? Well, informally it's what its name suggests - just like a function except that h(x) is allowed to take many values. A formal definition could be something like this. A multivalued function from A to B is a subset H of AxB such that for each a in A there is at least one b in B such that (a,b) is in H. (If you replace `at least' by `exactly' you get back to the formal definition of a function.) If h is a multivalued function from A to B and g a multivalued function from B to C then gh consists of all pairs (a,c) in AxC such that there exists b in B with (a,b) in H and (b,c) in G. (Or one could write b=h(a) and c=g(b) and just understand that this was a shorthand - h(a) does not stand for a particular element of B etc.)
One can represent a function f from A to B pictorially by drawing an arrow from each a in A to its image f(a) in B. A multivalued function would be represented by drawing arrows from a to each of its possible images. The only restriction would be that every a in A must have at least one arrow from it to an element of B.
Now let us return to the set-up we had a moment ago: f=gh, where h:A-->B is multivalued and g:B-->C is a normal function. What does that tell us about f? Well, f is a multivalued function from A to C, but it might just happen to be single-valued. This would be true if, whenever h(a) took several different values in B, g sent all those values to the same point in C. So then, even though there was something wicked about h, f would come out as just a normal function. Under such circumstances we breathe a sigh of relief and say that f is well-defined. But notice that there is something to check. In pictorial terms, if there are several arrows coming out of a, you must check that whichever one you go along to get to B, when you continue your journey to C you end up at the same point.
When is it useful to define a function as a composition of the above sort? The most common context is when one is defining an operation on some sort of quotient. Suppose X is some algebraic structure with a binary operation * and E is an equivalence relation on X. We can form a quotient set X/E, the elements of which are the equivalence classes of the relation E. If A and B are two such classes, we can attempt to define A*B as follows: pick elements a and b from A and B and let A*B be the equivalence class C that contains the element c=a*b.
The trouble with the above is that C may not be uniquely determined. How do we know that different choices of a and b will not lead to different C? We have to check this before we can say that * is a well-defined operation on the quotient space.
Now let me say the same thing in the language of multivalued functions. We are trying to define a binary operation on X/E, the set of all equivalence classes of E. That is, we want to define a function on (X/E)x(X/E). So we do this in two stages. Given (A,B) we first map it to (a,b) (where a is in A and b is in B). Of course, this isn't really a map but a multivalued function, since a and b can take many different values. Then we map (a,b) to a*b. Finally, we map a*b to the equivalence class of a*b. The last two stages were bona-fide functions, so we have composed a multivalued function with a single-valued function. The result is potentially not well-defined (that is, single-valued), but often it turns out that it is.
So, `well-defined' is perfectly well-defined. It means `single-valued' and carries with it the suggestion that the function that is single-valued might easily not have been.
A final remark: for the definition of a function f:A-->B to be a good one, it must pick out, for each element of A, exactly one element of B. That is, for each a in A, f(a) must exist and be unique. I have concentrated on uniqueness. Obviously, if your attempted definition doesn't pick out anything for f(a) then it's not well-defined, but this is a rather more straightforward idea to grasp. (It could be an issue if, for example, B was a subset of a set C and f was presented as a function from A to C that happened, non-obviously, to take all its values in B.)