×
Ir ao conteúdo
  • Cadastre-se

C Método do Ponto Fixo


Sskrainer

Posts recomendados

Olá, tudo bem?

Tentei reproduzir o método do ponto fixo de acordo com esse  fluxograma, no entanto, estou tendo dificuldades, principalmente na parte do while(looping)...

Desde já, agradeço a ajuda!!!
 

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

float f(float x)
{	
float y;
y = exp(x) + x - 6.0;
return y;			
}

float g(float z)
{
float w;	
w= 6/(z+1.0);
return w;
}

float fixo(float a, float b, float tol)
{
float c,fa,fb,fc,gc,fgc;
fa=f(a);
fb=f(b);
c=(a+b)/2.0;
fc=f(c);
gc=g(c);
fgc=f(gc);

while(fabs(fgc)>tol)
c=(a+b)/2;	
fc=f(c);
fgc = f(gc);

int main()
{
float a, b, fgc, toleranca;

printf("Metodo do Ponto Fixo.\n \n");
printf("Digite o Valor de a:");
scanf("%f", &a);
printf("Digite o Valor de b:");
scanf("%f", &b);		
printf("Digite o valor da tolerancia:");
scanf("%f", &toleranca);
while(f(a)*f(b)>0){
printf("Nao foi possivel calcular o valor nesse intervalo...\n\n");
printf("Digite um novo intervalo. \n\n");
printf("Digite o novo Valor de a:");
scanf("%f", &a);
printf("Digite o novo Valor de b:");
scanf("%f", &b);	
}
printf("Raiz aproximada de %0.5f", fgc);
system("pause");
return 0;
}

 

Screenshot_1.jpg

Link para o comentário
Compartilhar em outros sites

@Sskrainer  Sua função 'fixo' está incompleta e não está sendo usada no programa principal. Os dois loops podem ficar em main.

 

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

float f(float x){	
    float y = exp(x) + x - 6.0;
    return y;			
}

float g(float z){
    float w = 6/(z + 1.0);
    return w;
}

int main(){
    float a, b, x, tol, novo = 0;

    printf("Metodo do Ponto Fixo.\n \n");
    printf("Digite o valor da tolerancia: ");
    scanf("%f", &tol);

    do{
        if(novo){
            printf("Nao foi possivel calcular...\n\n");
        }
        printf("Digite o Valor de a: ");
        scanf("%f", &a);
        printf("Digite o Valor de b: ");
        scanf("%f", &b);
        novo = 1;
    }while(!((f(a) * f(b)) < 0));
    
    x = (a + b)/2;
    
    while(!(fabs(f(g(x))) < tol)){
         x = g(x);
    }
    printf("Raiz aproximada de %0.5f\n",f(g(x)));
    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

@Sskrainer  Se tiver acesso a uma biblioteca acho que você pode pegar um livro e seguir o conteúdo, praticando, fazendo anotações e avançando quando entender o que está sendo ensinado. Se achar algum assunto ou conceito complicado de entender você pode focar nele e procurar mais exemplos em outras fontes auxiliares (web, apostila, etc).

Link para o comentário
Compartilhar em outros sites

Sempre que tiver uma dúvida objetiva pode perguntar em um lugar como esse forum. Não insista demais em um mesmo tópico sem buscar algo assim.

 

Escreva seus programas em torno dos dados e não escreva uma única linha de programa sem razão.

 

Sobre seu programa e o tópico:

 

Seu programa sequer compila, porque fixo() está incompleta. Ao usar loops como while() enquanto está aprendendo sempre use duas chaves para delimitar as instruções do loop, mesmo que seja uma única linha. Assim saberá que não esqueceu nada ou colocou um ';' por engano...
 

while(fabs(fgc)>tol);
{
    c=(a+b)/2;	
    fc=f(c);
    fgc = f(gc);
};	// while()

 

Sobre o código acima, por exemplo:

  • escrevi isso para mostrar. Sei que não está em seu código
  • entenda que o código é perfeitamente legal ,mas o loop nada tem a ver com o bloco { } porque o ;  termina o while(). Esse é um erro comum entre iniciantes. E mesmo em outros círculos :) 
  • colocar um comentário como esse ao final pode ajudar se o loop tem várias linhas e só o rabo dele aparece na tela, muitas vezes vai gostar de saber o que está terminando ali... Veja:
     
       fc=f(c);
        fgc = f(gc);
    };	// while()

     

Nem todo loop tem 3 ou 4 linhas e é improdutivo ficar voltando o código só por isso.

  • não declare mais de uma variável por linha
  • inicialize tudo.
  • teste SEMPRE o retorno de scanf(). É ingenuidade não fazer isso: se não conseguir ler o  valor de 'a' qual o propósito de seguir com o programa???? 
  • leia. sites como Tutorials Point e Geeks for Geeks são muito amigáveis e tem exemplos bem simples de tudo
  • leia programas de terceiros. Em especial de gente que você ache que programa bem. Ou profissionais. Tem códigos de excelente qualidade, códigos de produção, disponíveis em todo lugar na internet. um exemplo ingênuo: o código do compilador, gcc está disponível em https://github.com/gcc-mirror/gcc;) Nem tente compilar isso ainda. Mas entenda como as pessoas escrevem isso, comentam isso, alinham isso.
  • alinhe seu código
  • aprenda a documentar o que faz. Por exemplo nesse seu post seria melhor ter
    • o código alinhado
    • a função que tenta interpolar
    • o resultado esperado
    • aquela sua continha em papel cortada na figura foi mal ;) 
    • ajudaria saber que IDE está usando, se algum,. A versão de compilador e o sistema.

ih preciso sair agora...

Link para o comentário
Compartilhar em outros sites

Hora do ☕

Métodos numéricos estão em minha memória distante :D , Bem distante :( . no entanto o seu fluxograma descreve tentar descrever o método da bissecção...

Use seu programa para se acostumar com as coisas e ter ideia do que fazer. Para isso são os computadores afinal... E use nomes mais expressivos para o que está escrevendo. 

 

Exemplo
 

 

O programa abaixo foi claro escrito com recortar-e-colar, em minutos. Claro que inicialmente só mostrava o valor para a função, e mostra
 

resultados da funcao alvo para x entre -5 e 5
x = -5.000, f(x) = -10.993
x = -4.000, f(x) = -9.982
x = -3.000, f(x) = -8.950
x = -2.000, f(x) = -7.865
x = -1.000, f(x) = -6.632
x =  0.000, f(x) = -5.000
x =  1.000, f(x) = -2.282
x =  2.000, f(x) =  3.389
x =  3.000, f(x) = 17.086
x =  4.000, f(x) = 52.598
x =  5.000, f(x) = 147.413

resultados da funcao de iteracao para x entre 1 e 2, invervalo de  0.100
x =  1.000, f_iter(x) =  1.609
x =  1.100, f_iter(x) =  1.589
x =  1.200, f_iter(x) =  1.569
x =  1.300, f_iter(x) =  1.548
x =  1.400, f_iter(x) =  1.526
x =  1.500, f_iter(x) =  1.504
x =  1.600, f_iter(x) =  1.482
x =  1.700, f_iter(x) =  1.459
x =  1.800, f_iter(x) =  1.435
x =  1.900, f_iter(x) =  1.411

Valor calculado de f(x) para esses pontos
x =  1.000, f(x) =  0.609
x =  1.100, f(x) =  0.489
x =  1.200, f(x) =  0.369
x =  1.300, f(x) =  0.248
x =  1.400, f(x) =  0.126
x =  1.500, f(x) =  0.004
x =  1.600, f(x) = -0.118
x =  1.700, f(x) = -0.241
x =  1.800, f(x) = -0.365
x =  1.900, f(x) = -0.489

Inicial =  1.000. Primeiros 10 pontos da serie:
x = 0 f(x) = 1.609438
x = 1 f(x) = 1.479457
x = 2 f(x) = 1.508632
x = 3 f(x) = 1.502157
x = 4 f(x) = 1.503598
x = 5 f(x) = 1.503278
x = 6 f(x) = 1.503349
x = 7 f(x) = 1.503333
x = 8 f(x) = 1.503336
x = 9 f(x) = 1.503336

 

Eis o código

 

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

float f_alvo(float x)
{	
return exp(x) + x - 6.0;
}

float f_iter(float z)
{
    return log(6-z);
}

int main(void)
{
    printf("\
\nresultados da funcao alvo para x entre -5 e 5\n");
    for( float x = -5; x <= 5; x += 1)
    {
        printf( "x = %6.3f, f(x) = %6.3f\n", x, f_alvo( x ));
    }

    float intervalo = 0.1f;
    printf("\
\nresultados da funcao de iteracao para x entre 1 e 2, invervalo de %6.3f\n",
    intervalo);
    for( float x = 1.; x <= 2.; x += intervalo)
    {
        printf( "x = %6.3f, f_iter(x) = %6.3f\n", x, f_iter(x ));
    }

    printf("\
\nValor calculado de f(x) para esses pontos\n");
    for( float x = 1.; x <= 2.; x += intervalo)
    {
        printf(
            "x = %6.3f, f(x) = %6.3f\n", x, f_alvo( f_iter(x ) )
        );
    }

    float inicial = 1.;
    printf("\
\nInicial = %6.3f. Primeiros 10 pontos da serie:\n", inicial);
    for( int x = 0; x < 10; x += 1)
    {
        inicial = f_iter(inicial); // proximo na serie
        printf("x = %d f(x) = %8.6f\n", x, inicial );
    }

    return 0;
}

 

E assim pode usar C para olhar a série e entender o método, e assim ver onde ele converge e saber o que esperar de seus cálculos...

 

Uma recomendação a mais: NUNCA use programas interativos de este. É bobagem. Só vai perder seu tempo digitando valores e enter e valores e enter. Use constantes ou um gerador de dados (função factory).

 

E se precisar mesmo ler dados leia de um arquivo. É muito, mas muito mais fácil usar o mesmo editor de texto e digitar os dados.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Curso de Hacker Ético

LANÇAMENTO!

CLIQUE AQUI E CONFIRA!

* Este curso não é ministrado pela equipe do Clube do Hardware.