Pro seu programa python, `4*(1/(1+x^2))` não passa de uma string. Quando você digita isso no interpretador python, isso não é entendido como uma string, mas como código python.
A pergunta parece simples, mas na verdade esse é um requisito bem complicado... Se o seu programa precisa receber fórmulas matemáticas do usuário e interpretar essas fórmulas, ele precisará de soluções similares ao que o código fonte da própria linguagem usa para interpretar essas funções matemáticas. Tenha em mente que um programa que recebe apenas um valor é imensamente mais simples do que um capaz de interpretar expressões matemáticas.
Como você colocou no seu segundo código, contudo, existe essa função "eval". A função não interpretará apenas funções matemáticas, mas código python em geral. Isso significa que você pode dar uma instrução ao Python para que ele execute código python inserido pelo usuário e retorne o valor final.
Você consegue imaginar como isso poderia ser usado, numa situação real, de forma maliciosa por um usuário mal intencionado? Num exercício didático não há o menor problema em usar algo assim, mas num programa mais profissional você estaria dando liberdade para o usuário colocar qualquer código python que seu programa execute, e isso será executado com as permissões do seu programa e não com as permissões do usuário. Você poderia, por exemplo, entrar com um código python que apaga todos os arquivos do disco ao invés de uma expressão matemática. No mundo real, essa instrução `eval` é raramente usada e se você tivesse um requisito que requeresse interpretar funções matemáticas, o melhor provavelmente seria achar uma biblioteca especifica para avaliar expressões matemáticas e usar.
No seu caso - fica a pergunta - por que você quer que o usuário digite uma expressão matemática? Você não conseguiria resolver o mesmo problema de forma mais simples, pedindo para o usuário digitar apenas um valor?
Abraços,
Marcelo.