EP 2

EP 2

por Alfredo Goldman -
Número de respostas: 43
Olás,
  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
Em resposta à Alfredo Goldman

Re: EP 2

por Alfredo Goldman -
Olás,
  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
Em resposta à Alfredo Goldman

Re: EP 2

por Elienos Pereira de Oliveira -

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.

Em resposta à Elienos Pereira de Oliveira

Re: EP 2

por Alfredo Goldman -
Olá,
  Eu também não sei sorriso, mas olhando com atenção, tanto x como y e erroAceitável
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
Em resposta à Alfredo Goldman

Re: EP 2

por Elienos Pereira de Oliveira -

Nos testes é necessário usar um metodo boolean, ou eu posso fazer apenas com void que imprime uma mensagem no final

Em resposta à Elienos Pereira de Oliveira

Re: EP 2

por Alfredo Goldman -
Oi,
  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 sorriso

Alfredo
Em resposta à Alfredo Goldman

Re: EP 2

por Eduardo W -
se os valores do x podem ser só de -1 à 1, como vou fazer os teste pra PI/2, 2PI, que são maiores q 1 ?!?!?! 
Em resposta à Eduardo W

Re: EP 2

por Alfredo Goldman -
Oi,
  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
Em resposta à Alfredo Goldman

EP 2

por Aline Durães -
PROF... a secante nos testes tem q estar aonde? O da comparação não,mas e os outros como eu chamo o método???
Em resposta à Aline Durães

Re: EP 2

por Diego Zuqueto -

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)

Em resposta à Aline Durães

Re: EP 2

por Alfredo Goldman -
Oi Aline,
  Não entendi a sua pergunta triste
  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
Em resposta à Alfredo Goldman

Re: EP 2

por André Meneghelli -
Eu não posso fazer uma função que faz uma geração de numeros de entrada para a função de teste randômica entre 0 e 1, para o uso nos testes utilizando as propriedades??? Estive pensando em fazer os testes para uma porção de numeros gerados aleatóriamente, e imprimir se ocorrer erro.

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!!!
Em resposta à André Meneghelli

Re: EP 2

por Alfredo Goldman -
Oi André,
  A sua idéia me pareceu bem interessante, vai bastar fazer um laço gerando um número aleatório.

Alfredo
Em resposta à Alfredo Goldman

Re: EP 2

por André Meneghelli -
Outra coisa, ja montei os meus testes automatizados. Acho que o erro para as funções do tipo sen(x) 2 +cos(x) 2 = 1 se propaga de forma quadradica, então, a margem de erro dessas expressões sera bem maior do que a do sen e cos em si. Por exemplo. E na parte de teste com a função matematica do java, é para analisar o metodo para um erro aceitavel como nos testes pelas propriedades???

Em resposta à André Meneghelli

Re: EP 2

por Alfredo Goldman -
Oi,
  Se o erro é quadrático, você deve considerar isto no seu teste.

Alfredo
Em resposta à Alfredo Goldman

Re: EP 2

por André Meneghelli -

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!!! mostrando a língua

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???

Em resposta à André Meneghelli

Re: EP 2

por Alfredo Goldman -
Quantas perguntas.

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 sorriso
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
Em resposta à Alfredo Goldman

Re: EP 2

por André Meneghelli -

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???

Em resposta à André Meneghelli

Re: EP 2

por André Meneghelli -

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!!!

Em resposta à André Meneghelli

Re: EP 2

por Alfredo Goldman -
Oi,
  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
Em resposta à Alfredo Goldman

Re: EP 2

por André Meneghelli -
Mas a exponencial entre 0 e 1 sempre da um resultado maior que 1, e o logaritmo proximo de zero tende a um numero negativo grande demais. Acho que a melhor solução ou é restringir o intervalo de testes, ou fazer como eu sugeri embaixo... É só uma idéia...
Em resposta à André Meneghelli

Re: EP 2

por André Meneghelli -

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!!!

Em resposta à André Meneghelli

Re: EP 2

por André Meneghelli -

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???

Em resposta à André Meneghelli

Re: EP 2

por Alfredo Goldman -
Oi,
  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
Em resposta à Alfredo Goldman

Re: EP 2

por Thiago Silva Lisboa -

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???

Em resposta à Thiago Silva Lisboa

Re: EP 2

por André Meneghelli -
é o seguinte, como o meu ep esta fazendo uma quantidade muito grande de testes, não vale a pena imprimir na tela quando o resultado é o esperado. Ja que para imprimir na tela gasta grande tempo de processamento e ficaria ruim de ler. Mas acho que para poucos testes, isso não atrapalha. Uma idéia era colocar letras minusculas para acerto e maiusculas para erro... No meu isso é inviavel...
Em resposta à André Meneghelli

Re: EP 2

por Alfredo Goldman -
Oi,
  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
Em resposta à Alfredo Goldman

Re: EP 2

por André Meneghelli -
Com certeza, eu ja havia implementado no metodo a verificação de que todos os 6600 testes haviam sido realizados de forma correta. E no final de cada tipo de teste aparece escrito "100% correto!!!" caso não tenha ocorrido nenhum erro em nenhum dos testes.
Em resposta à André Meneghelli

Re: EP 2

por Thiago Silva Lisboa -

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!

Em resposta à Alfredo Goldman

Re: EP 2

por Thiago Cardoso de Souza -

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) ???

Em resposta à Thiago Cardoso de Souza

Re: EP 2

por Alfredo Goldman -
Oi Thiago,
  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
Em resposta à Alfredo Goldman

EP 2

por Thales Burgui Barbosa Reis -
Professor naum consiguo sair daqui....tah danu um erro no teste do LN ele naum tah aceitandu o Math.ln ve se eu fiz certo por favor!!



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));

Em resposta à Alfredo Goldman

Re: EP 2

por André Meneghelli -

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...

Em resposta à Alfredo Goldman

Re: EP 2

por Jair Pontes Pisani -
As notas do EP2 de todos devem estar divulgadas aqui no Paca. Se alguem ainda nao recebeu a sua, por favor me mandem um e-mail -> jairpp@gmail.com