Pequena mudança no enunciado do segundo EP (para facilitar). Com relação
a tangente pode ser usada a fórmula sen/cos para calculá-la. Além disto ao
invés do cálculo da secante, pode se calcular a sec ao quadrado e após isto
extrair a raiz, através de Math.sqrt. Sendo assim, será calculado o módulo da
secante.
Alfredo
Mais uma mudança (para facilitar o segundo EP), a secante também pode
ser calculada a partir do inverso do cosseno. Todas as outras funções devem ser
calculadas com as séries de Taylor (sem usar Math.pow).
Boa semana do Break,
Alfredo
Na parte dos testes automatizados o enunciado está sugerindo criar um metodo boolean igual
(double x, double y, double erroAceitável), eu não sei como determinar qual é o erroAceitável.
Eu também não sei
são parâmetros (fornecidos por quem chamou o método), logo a sua preoucupação
não é determinar o erro aceitável, mas sim determinar a resposta (boolean) conforme os valores de x,y e erroAceitável. Ficou mais fácil ?
Alfredo
Nos testes é necessário usar um metodo boolean, ou eu posso fazer apenas com void que imprime uma mensagem no final
Como não foi especificado, pode ser boolean ou void, mas no meu ponto de vista
o mais correto seria imprimir uma mensagem ao final, e devolver true se o método
se chamar algo como existeErro e houver erro
Alfredo
Como os valores para os cálculos tem que estar entre -1 e 1 a priori não
há garantia que para as séries os testes funcionariam. Por outro lado, se você
sabe calcular os seno e cosseno para valores até PI/4, usando regras bem simples
de trigonometria, você calcula os senos e cossenos para outros valores...
Ex: se x >= 2*PI sen (x) = sen (x - 2*PI)
Alfredo
Aline, pra vc chamar o metodo se ele estiver numa classe separa vc deve por no inicio da sua classe teste
Ex.:
Funcoes c = new Funcoes();
e quando vc precisar usar a secante vc coloca assim
c.secante(x)
Não entendi a sua pergunta

A idéia é que os seus testes sejam capaz de testar diversas situações da
sua classe de contas, tanto comparando com a classe Math, como vendo
se relações trigonométricas (sen2 + cos2 = 1) são válidas.
Alfredo
Isso faria com que o usuario do programa não tenha que ficar colocando parametros de entrada. Pode ser feito assim??? O meu cabeçalho ficaria da seguinte forma:
boolean senCos(double erroAceitavel)
e a função testaTudo roda usando o erro aceitavel digitado inicialmente pelo usuario fazendo uns 200 testes para cada propriedade. Ai eu colocava uma porcentagem de conclusão para ficar bonitinho. Em Java tem o caracter \r como em C??? He he he... Espero que possa ser feito desse jeito, pq eu ja to fazendo assim!!!
A sua idéia me pareceu bem interessante, vai bastar fazer um laço gerando um número aleatório.
Alfredo
Se o erro é quadrático, você deve considerar isto no seu teste.
Alfredo
Sim, vou considerar então. O erro para a comparação direta entre as funções é o mesmo em que foi calculado, exeto para a tg!!! Esqueci como faz a propagação dos erros!!! Vc acha necessario desenvolver isso ou simplesmente estimar um erro arbitrariamente para estas funções???
Devo usar as de arco duplo também??? Como sen(2x) = 2 * sen(x)*cos(x) ??? Até agora coloquei só a comparação entre sen e cos; e entre sec e tg nas relações trigonometricas fundamentais.
Como gero um numero de ponto flutuante com precisão dupla usando a Randon??? Eu usei o gerador de inteiros e fiz a transformação usando uma equação matematica e um cast!!!
E a ultima coisa, a função testaTudo pode receber um parâmetro de entrada double para fazer a alteração nas incertezas ou deve ser sem parâmetros de entrada???
Sobre a propagação de erros não precisa levar tão a sério, mas faça testes com
erros condizentes com os erros que serão gerados pelas suas implementações.
Boa idéia de usar arcos duplos, quanto mais funções melhor
O método random da class Math gera um double entre 0 e 1... (
random()
Returns a
double
value with a positive sign, greater
than or equal to 0.0
and less than 1.0
.)A priori a idéia para o testaTudo é que ele faça tudo automaticamente, sem receber
nenhum parâmetro, a alteração das incertezas deve ser feita dentro dele.
Alfredo
Mas vc acha necessario fazer o teste para incertezas diferentes??? O meu ep ja vai fazer muitos testes para a mesma incerteza. Posso fazer 3 baterias na testa tudo... E fazer 200 de cada tipo. Sera que deixa o programa muito lento??? To acostumado com linguagem C!!!
Outra coisa, a serie de taylor não funciona para ln e ex para numeros negativos. Ln pq a função não é definida e a exponencial eu não sei porquê. Seria necessaria uma serie diferente para a exponencial negativa???
Encontrei um possivel erro no ep, neste pedaço do enunciado:
"2. Testes usando propriedades conhecidas das funções em questão como, por exemplo, cos2+sen2 = 1, tan2 + 1 = sec2, exp(ln(x)) = x, etc."
As nossas series de Taylor devem ser feitas para numeros entre -1 e 1. No entanto, o ln(x) pode dar resultados maiores do que um para o intervalo de 0 à 1. Este teste não vai funcionar e o programa apresentará falhas se o teste for realizado de forma aleatória!!!
Respondendo as duas últimas perguntas em um só e-mails.
1) Sobre o número de testes, sabemos a priori que não é viável testar
todas as situações possíveis, mas sim, é possível fazer vários testes. Além
do que se for mudada a precisão três vezes, os seus 200 testes iniciais vão virar
apenas 600, e isto roda rápido;
2) Sobre os expoentes eu usaria apenas os positivos, afinal não faz sentido log de números negativos.
Alfredo
Pensei numa solução para o problema. Colocamos a função interna como sendo a nossa série e a externa da Math. E faz dois testes distintos:
Math.log(series.exp(x)) == x;
Math.exp(series.log(x)) == x;
Ha ha ha, pra que esquentar a cabeça com detalhes!!!
Bom, até o momento o meu ep ta fazendo um total de 6600 testes. Sendo que existem 11 tipos diferentes de testes, cada um ocorrendo 200 vezes, com incertezas diferentes, que variam por tres vezes. Então o meu Ep só imprime erros e não acertos!!! Pq senão a tela fica muito cheia!!!
Coloquei tb valores para corrigir a serie de ln. O meu ep não consegue calcular para ln(x) com x<0.03, poquê da erro de Overflow. Tem algum problema nessas modificações???
A idéia de se imprimir apenas quando o teste dá errado é essencial quando
se fazem testes, caso contrário seria difícil de usar os testes automatizados.
Sobre o problema do overflow, tem algo estranho, pois para valores de entrada
menores do que 1, deveria funcionar pois o termo tende a zero.
Alfredo
Olá
Agora eu não entendi mais nada, pois o ennunciado do EP fala que se deve imprimir uma mensagem sucinta do que foi testado para os testes que derem certo???
Sendo ainda mais explícito, o correto quando se faz testes é, no caso
que todos passem, imprimir ao final, "final dos testes" sem erros, ou algo
assim.
A cada teste só deve ser impresso algo se o teste falhar.
Alfredo
Eu imprimi inclusive os testes que haviam dado certo: 1º que estava no enunciado do EP; 2º que não tem tantos testes que nem o do André, até mesmo porque não especificava quantos testes deveriam ser feitos, e sim quais tipos de testes!
Apenas um detalhe, lembre-se que as comparações não podem ser
feitas usando apenas == pois podem existir diferenças na precisão.
Alfredo
Poderia facilitar ainda mais o cálculo da tangente, utilizando o método:
double tan(double x)
E então retornando o valor através de Math.tan(x) ???
Não, você não pode usar Math para o cálculo da tangente, você
deve usar as fórmulas que fez para seno e cosseno.
Alfredo
void testaLn (double errao)
{
CálculosAproximados c = new CálculosAproximados();
double y = 0;
double l = (Math.ln(1+y) - c.calculaLn(y)) * (java.lang.Math.ln(1+y) - c.calculaLn(y));
double e = (java.lang.Math.exp(y) - c.calculaEx(y)) * (java.lang.Math.exp(y) - c.calculaEx(y));
Estou tendo o seguinte problema no meu ep!!!
no inicio do codigo coloco:
import java.lang.*;
Então quando vou fazer o teste com a comparação da serie de taylor com a função do java aloco dinamicamente o objeto da seguinte forma:
java.lang.Math m2 = new java.lang.Math();
Então o seguinte erro aparece:
File: I:\ep2\ep2.java [line: 139]
Error: Math() has private access in java.lang.Math
Estou fazendo algo errado ou é a instalação do meu compilador que esta com problemas??? A comparação com valores conhecidos não é desnecessaria??? Ja que, teoricamente, os valores conhecidos não tem que ser calculados usando a função Math?? O unico jeito que eu vejo uma utilidade para isso é se eu calcular na calculadora e copiar e colar no codigo fonte...
Desta vez basta o arquivo .java.
Alfredo
Problema resolvido!!!
Olá!
Por um acaso alguém ainda não tem dupla para fazer o 3º EP ???
Esse vai ser muito difícil fazer sozinho.
Jair, quando sai as notas do Segundo EP
???????????????????????????????????????????????