Sunteți pe pagina 1din 13

Programas en C para solución de ecuaciones no lineales.

/*1. Método de Bisección.*/

#include<stdio.h>

#include<math.h>

double F(double);

void INPUT(int *, double *, double *, double *, double *, double *, int *);

main() {

double A,FA,B,FB,C,P,FP,TOL;

int I,NO,OK;

INPUT(&OK, &A, &B, &FA, &FB, &TOL, &NO);

if (OK) {

I = 1;

OK = true;

while ((I<=NO) && OK) {

C = (B - A) / 2.0;

P = A + C;

FP = F(P);

printf("%3d %15.8e %15.7e \n",I,P,FP);

if ((abs(FP)<0) || (C<TOL)) {

printf("\nSolucion aproximada P = %11.8f \n",P);

OK = false;

else {

I++;

if ((FA*FP) > 0.0) {

A = P; FA = FP;

else {

B = P; FB = FP;
}

if (OK) {

printf("\nLa iteracion %3d",NO);

printf(" da la aproximacion %12.8f\n",P);

printf("fuera de la tolerancia aceptada\n");

getchar();

getchar();

double F(double X)

double f;

f = ( X + 4.0 ) * X * X - 10.0;

return f;

void INPUT(int *OK, double *A, double *B, double *FA, double *FB, double *TOL, int *NO)

double X;

*OK = false;

while (!(*OK)) {

printf("Dar el valor de A\n");

scanf("%lf", A);

printf("Dar el valor de B\n");

scanf("%lf", B);

if (*A > *B) {

X = *A; *A = *B; *B = X;
}

if (*A == *B) printf("A debe ser diferente de B\n");

else {

*FA = F(*A);

*FB = F(*B);

if (*FA*(*FB) > 0.0) printf("F(A) y F(B) tienen el mismo signo\n");

else *OK = true;

*OK = false;

while(!(*OK)) {

printf("Dar la tolerancia\n");

scanf("%lf", TOL);

if (*TOL <= 0.0) printf("La tolerancia debe ser positiva\n");

else *OK = true;

*OK = false;

while (!(*OK)) {

printf("Dar el numero de iteraciones maximo\n");

scanf("%d", NO);

if (*NO <= 0) printf("Debe ser un numero natural\n");

else *OK = true;

/*2. Programa de posición falsa ó falsa posición.*/


#include<stdio.h>

#include<math.h>
double F(double);

void INPUT(int *, double *, double *, double *, double *, double *, int *);

main() {

double Q,P0,Q0,P1,Q1,C,P,FP,TOL;

int I,NO,OK;

INPUT(&OK, &P0, &P1, &Q0, &Q1, &TOL, &NO);

if (OK) {

I = 2;

OK = true;

Q0 = F(P0);

Q1 = F(P1);

while ((I<=NO) && OK) {

P = P1 - Q1 * (P1 - P0) / (Q1 - Q0);

Q = F(P);

printf("%3d %15.8e %15.8e\n",I,P,Q);

if (abs(P-P1) < TOL) {

printf("\nSolucion aproximada P = %12.8f\n",P);

OK = false;

else {

I++;

if ((Q*Q1) < 0.0) {

P0 = P1; Q0 = Q1;

P1 = P; Q1 = Q;

if (OK) {
printf("\nLa iteracion numero %3d",NO);

printf(" da la aproximacion %12.8f\n",P);

printf("fuera de la tolerancia\n");

getchar();

getchar();

double F(double X)

double f;

f = tan(X) - X;

return f;

void INPUT(int *OK, double *P0, double *P1, double *Q0, double *Q1, double

*TOL, int *NO)

double X;

*OK = false;

while (!(*OK)) {

printf("Dar el valor de P0\n");

scanf("%lf", P0);

printf("Dar el valor de P1\n");

scanf("%lf", P1);

if (*P0 > *P1) {

X = *P0; *P0 = *P1; *P1 = X;

if (*P0 == *P1) printf("P0 no debe ser igual a P1.\n");

else {
*Q0 = F(*P0);

*Q1 = F(*P1);

if (*Q0*(*Q1) > 0.0) printf("F(P0) y F(P1) tiene el mismo signo\n");

else *OK = true;

*OK = false;

while(!(*OK)) {

printf("Dar la tolerancia\n");

scanf("%lf", TOL);

if (*TOL <= 0.0) printf("La tolerancia debe ser positiva\n");

else *OK = true;

*OK = false;

while (!(*OK)) {

printf("Dar el numero de iteraciones maximo\n");

scanf("%d", NO);

if (*NO <= 0) printf("Debe ser un entero positivo\n");

else *OK = true

/*3 Programa de Punto fijo.*/


#include<stdio.h>

#include<math.h>
void INPUT(int *, double *, double *, int *);

void OUTPUT(FILE **, int *);

double G(double );

main() {

double TOL,P0,P;

int I,NO,OK;

INPUT(&OK, &P0, &TOL, &NO);

if (OK) {

I = 1; OK = true;

while((I<=NO) && OK) {

P = G(P0);

printf("%3d %15.8e\n", I, P);

if (abs(P-P0) < TOL) {

printf("\nSolucion aproximada P = %12.8f\n", P);

OK = false;

else {

I++;

P0 = P;

if (OK) {

printf("\nLa iteracion numero %3d", NO);

printf(" da la aproximacion %12.8f\n", P);

printf("fuera de la tolerancia aceptada\n");

getchar();

getchar();
}

double G(double X)

double g;

g= 2-exp(-X);

//g = sqrt(10.0 / (4.0 + X));

return g;

void INPUT(int *OK, double *P0, double *TOL, int *NO)

*OK = false;

printf("Dar la aproximacion inicial\n");

scanf("%lf",P0);

while(!(*OK)) {

printf("Dar la tolerancia\n");

scanf("%lf", TOL);

if (*TOL <= 0.0) printf("La tolerancia debe ser positiva\n");

else *OK = true;

*OK = false;

while (!(*OK)) {

printf("Dar el numero de iteraciones maximo\n");

scanf("%d", NO);

if (*NO <= 0) printf("Debe ser un numero natural\n");

else *OK = true;

/*4.Programa para calcular una raíz por método de Newton-Raphson.*/


#include<stdio.h>

#include<math.h>

double F(double);

double FP(double);

void INPUT(int *, double *, double *, int *);

main() {

double TOL,P0,D,F0,FP0;

int OK,I,NO;

INPUT(&OK, &P0, &TOL, &NO);

if (OK) {

F0 = F(P0);

I = 1;

OK = true;

while ((I<=NO) && OK) {

FP0 = FP(P0);

D = F0/FP0;

P0 = P0 - D;

F0 = F(P0);

printf("%3d %14.8e %14.7e\n",I,P0,F0);

if (abs(D) < TOL) {

printf("\nSolucion aproximada = %.10e\n",P0);

OK = false;

else I++;

if (OK) {

printf("\nLa iteracion %d",NO);


printf(" da la aproximacion %.10e\n",P0);

printf("fuera de la tolerancia aceptada\n");

getchar();

getchar();

double F(double X)

double f;

f = cos(X) - X;

return f;

double FP(double X)

double fp;

fp = -sin(X) - 1;

return fp;

void INPUT(int *OK, double *P0, double *TOL, int *NO)

*OK = false;

printf("Dar aproximacion inicial\n");

scanf("%lf", P0);

while(!(*OK)) {

printf("Dar la tolerancia\n");

scanf("%lf", TOL);

if (*TOL <= 0.0) printf("La tolerancia debe ser positiva\n");

else *OK = true;


}

*OK = false;

while (!(*OK)) {

printf("Dar el numero de iteraciones maximo\n");

scanf("%d", NO);

if (*NO <= 0) printf("Debe ser un entero positivo\n");

else *OK = true;

/*5.Programa para determinar las raíces por le método de las secantes.*/

#include<stdio.h>

#include<math.h>

double F(double);

void INPUT(int *, double *, double *, double *, int *);

void OUTPUT(FILE **, int *);

main() {

double P0,F0,P1,F1,P,FP,TOL;

int I,NO,OK;

INPUT(&OK, &P0, &P1, &TOL, &NO);

if (OK) {

I = 2;

F0 = F(P0);

F1 = F(P1);

OK = true;

while ((I<=NO) && OK) {

P = P1 - F1 * (P1 - P0) / (F1 - F0);

FP = F(P);
printf("%3d %15.8e %15.8e \n",I,P,FP);

if (abs(P - P1) < TOL) {

printf("\nSolucion aproximada P = %12.8f\n",P);

OK = false;

else {

I++;

P0 = P1;

F0 = F1;

P1 = P;

F1 = FP;

if (OK) {

printf("\nLa iteracion %3d",NO);

printf(" da la aproximacion %12.8f\n",P);

printf("fuera de la tolerancia aceptada\n");

getchar();

getchar();

double F(double X)

double f;

f = sin(X) + X;

return f;

void INPUT(int *OK, double *P0, double *P1, double *TOL, int *NO)
{

*OK = false;

while (!(*OK)) {

printf("Dar la aproximacion inicial P0\n");

scanf("%lf", P0);

printf("Dar la otra aproximacion inicial P1\n");

scanf("%lf", P1);

if (*P0 == *P1) printf("P0 debe ser diferente a P1\n");

else *OK = true;

*OK = false;

while(!(*OK)) {

printf("Dar la tolerancia\n");

scanf("%lf", TOL);

if (*TOL <= 0.0) printf("La tolerancia debe ser positiva\n");

else *OK = true;

*OK = false;

while (!(*OK)) {

printf("Dar el numero de iteraciones maximo\n");

scanf("%d", NO);

if (*NO <= 0) printf("Debe ser un numero natural\n");

else *OK = true;

S-ar putea să vă placă și