Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Concerning the first question, you could try the following code:

var("x")
@interact
def Taylor(
    f = input_box(default="e^x", type=str),
    n = slider(vmin=0, vmax=10, step_size=1, 
               default=3, label="Select the order n: ")):

try:
    f = SR(f)
    if x not in f.variables():
        print("Illegal input. Try again")
    else:
        print("Taylor expansion:\n")
        print(f, " = " , f.series(x==0, n))
except TypeError:
    print("Please, finish typing a valid function")

See this SageMath Cell.

The first problem we have to face arises when SageMath reads the contents of the input box. In a Jupyter notebook, this happens many times per second while you type; in a SageMath Cell, just after hiting the Enter key. Without the type=str option in input_box, SageMath expects f to be an expression, so it can raise several kinds of errors, such as SyntaxError or NameError exceptions, for example, if the input is e^x+ (due to an unexpected EOF while parsing) or e^x+y (if y has not been defined as a variable). The option type=str avoids these errors, since f is just a string.

Now we can type a string without annoying error messages (well, still not; see below). The string is stored in f. But, before computing any series expansion, we have to convert f to a symbolic expression, done in the line f = SR(f), and check if x is a variable present in f. Hence, something like sin(a*x) is allowed, whereas t^2 just yields the error message «Illegal input…». If f contains a valid function, the Taylor expasion is obtained and printed. Then, in any case, the user can modify the expression or type a new one.

Why the main code is inside a try/except block? Suppose you want the expansion of e^(x^2). While you type, the content of the input box is processed. So, after writing, say e^(x^, SageMath would raise a TypeError exception, since e^(x^ is a malformed expression. Thanks to the the try/except commands, we can catch these errors and print a message to invite the user to finish typing.

Finally, I have replaced the taylor method by the series one, since, in general, f is not equal to the Taylor polynomial.

Concerning the second question, you can use similar code, like the following one:

R.<x,y,z> = PolynomialRing(QQ)

@interact
def Taylor(
    f = input_box(default="x+y+z", type=str)):
    try:
        f = SR(f)
        if f not in R:
            print("Illegal input. Try again")
        else:
            print("The polynomial belongs to R")
    except TypeError:
        print("Please, finish typing a polynomial")

See this SageMath Cell

Concerning the first question, you could try the following code:

var("x")
@interact
def Taylor(
    f = input_box(default="e^x", type=str),
    n = slider(vmin=0, vmax=10, step_size=1, 
               default=3, label="Select the order n: ")):

 try:
     f = SR(f)
     if x not in f.variables():
         print("Illegal input. Try again")
     else:
         print("Taylor expansion:\n")
         print(f, " = " , f.series(x==0, n))
 except TypeError:
     print("Please, finish typing a valid function")

See this SageMath Cell.

The first problem we have to face arises when SageMath reads the contents of the input box. In a Jupyter notebook, this happens many times per second while you type; in a SageMath Cell, just after hiting the Enter key. Without the type=str option in input_box, SageMath expects f to be an expression, so it can raise several kinds of errors, such as SyntaxError or NameError exceptions, for example, if the input is e^x+ (due to an unexpected EOF while parsing) or e^x+y (if y has not been defined as a variable). The option type=str avoids these errors, since f is just a string.

Now we can type a string without annoying error messages (well, still not; see below). The string is stored in f. But, before computing any series expansion, we have to convert f to a symbolic expression, done in the line f = SR(f), and check if x is a variable present in f. Hence, something like sin(a*x) is allowed, whereas t^2 just yields the error message «Illegal input…». If f contains a valid function, the Taylor expasion is obtained and printed. Then, in any case, the user can modify the expression or type a new one.

Why the main code is inside a try/except block? Suppose you want the expansion of e^(x^2). While you type, the content of the input box is processed. So, after writing, say e^(x^, SageMath would raise a TypeError exception, since e^(x^ is a malformed expression. Thanks to the the try/except commands, we can catch these errors and print a message to invite the user to finish typing.

Finally, I have replaced the taylor method by the series one, since, in general, f is not equal to the Taylor polynomial.

Concerning the second question, you can use similar code, like the following one:

R.<x,y,z> = PolynomialRing(QQ)

@interact
def Taylor(
    f = input_box(default="x+y+z", type=str)):
    try:
        f = SR(f)
        if f not in R:
            print("Illegal input. Try again")
        else:
            print("The polynomial belongs to R")
    except TypeError:
        print("Please, finish typing a polynomial")

See this SageMath Cell

Concerning the first question, you could try the following code:

var("x")
@interact
def Taylor(
    f = input_box(default="e^x", type=str),
    n = slider(vmin=0, vmax=10, step_size=1, 
               default=3, label="Select the order n: ")):

    try:
        f = SR(f)
        if x not in f.variables():
           print("Illegal input. Try again")
        else:
            print("Taylor expansion:\n")
            print(f, " = " , f.series(x==0, n))
    except TypeError:
        print("Please, finish typing a valid function")

See this SageMath Cell.

The first problem we have to face arises when SageMath reads the contents of the input box. In a Jupyter notebook, this happens many times per second while you type; in a SageMath Cell, just after hiting the Enter key. Without the type=str option in input_box, SageMath expects f to be an expression, so it can raise several kinds of errors, such as SyntaxError or NameError exceptions, for example, if the input is e^x+ (due to an unexpected EOF while parsing) or e^x+y (if y has not been defined as a variable). The option type=str avoids these errors, since f is just a string.

Now we can type a string without annoying error messages (well, still not; see below). The string is stored in f. But, before computing any series expansion, we have to convert f to a symbolic expression, done in the line f = SR(f), and check if x is a variable present in f. Hence, something like sin(a*x) is allowed, whereas t^2 just yields the error message «Illegal input…». If f contains a valid function, the Taylor expasion is obtained and printed. Then, in any case, the user can modify the expression or type a new one.

Why the main code is inside a try/except block? Suppose you want the expansion of e^(x^2). While you type, the content of the input box is processed. So, after writing, say e^(x^, SageMath would raise a TypeError exception, since e^(x^ is a malformed expression. Thanks to the the try/except commands, we can catch these errors and print a message to invite the user to finish typing.

Finally, I have replaced the taylor method by the series one, since, in general, f is not equal to the Taylor polynomial.

Concerning the second question, you can use similar code, like the following one:

R.<x,y,z> = PolynomialRing(QQ)

@interact
def Taylor(
    f = input_box(default="x+y+z", type=str)):
    try:
        f = SR(f)
        if f not in R:
            print("Illegal input. Try again")
        else:
            print("The polynomial belongs to R")
    except TypeError:
        print("Please, finish typing a polynomial")

See this SageMath Cell

EDIT.

According to Sébastien comment, it is better to move part of the code to an else clause. So, here we have a reformulation of the code:

var("x")
@interact
def Taylor(
    f = input_box(default="e^x", type=str),
    n = slider(vmin=0, vmax=10, step_size=1, 
               default=3, label="Select the order n: ")):
    try:
        f = SR(f)
    except TypeError:
        print("Please, finish typing a valid function")
    else:     
        if x not in f.variables():
            print("Illegal input. Try again")
        else:
            print("Taylor expansion:\n")
            print(f, " = " , f.series(x==0, n))

And also, for the second script:

R.<x,y,z> = PolynomialRing(QQ)

@interact
def Taylor(
    f = input_box(default="x+y+z", type=str)):
    try:
        f = SR(f)
    except TypeError:
        print("Please, finish typing a polynomial")
    else:
        if f not in R:
            print("Illegal input. Try again")
        else:
            print("The polynomial belongs to R")