Regressão Linear em C++ com Alocação Dinâmica de Matriz

O código ainda não está comentado para melhor compreensão mas farei isso em breve.

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

using namespace std;

float **cria_matriz(int linhas, int colunas) {
    float **matriz;
    matriz = (float**) malloc(linhas * sizeof(float)); //Aloca um Vetor de Ponteiros
    int x;
    for (x = 0; x < linhas; x++)
        matriz[x] = (float*) malloc(colunas * sizeof(float)); //Aloca um Vetor para cada posição do Vetor de Ponteiros.
    return matriz;
}

void imprime(int linhas, int colunas, float **matriz) {
    int l, c;
    for (l = 0; l < linhas; l++) {
        for (c = 0; c < colunas; c++)
            printf("%10.2f ", matriz[l][c]);
        printf("\n");
    }
}

float ux(float resultado, float xy, float **matriz, int i){
    int l, c;
    for (c = 2; c < 3; c++) {
        for (l = 0; l < i; l++){
matriz[l][c] =  resultado + (xy*matriz[l][0]);
        }             
    }
}

float dx(float **matriz, int i){
    int l, c;
    for (c = 3; c < 4; c++) {
        for (l = 0; l < i; l++){   
        if (matriz[l][1] > matriz[l][2]){
        matriz[l][c] =  matriz[l][1] - matriz[l][2];
        }
else{
        matriz[l][c] =  matriz[l][2] - matriz[l][1];
        }
        }             
    }
}

float dtotal(float **matriz, int i){
int l, c;
float dt = 0;

        for (l = 0; l < i; l++){
dt +=  pow(matriz[l][3],2);
        }             
    return dt;
}

int main(int argc, char** argv) {


printf("Digite quantos números deseja informar:");
int i;
scanf("%d", &i);

float **matriz = cria_matriz(i, 4);
    int l, c;
 
for ( int l = 0; l < i; l++ ) {
for ( int c = 0; c < 2; c++ ) {
if(c == 0){
cout<<"Numero x ["<<l<<"]["<<c<<"]: ";
    cin>>matriz[l][c];
}else{
cout<<"Numero y ["<<l<<"]["<<c<<"]: ";
    cin>>matriz[l][c];
}
}
 }
                   
    imprime(i, 2, matriz);
    printf("\n");

float x1 = 0;
float x = 0;
float y1 = 0;
float y = 0;
float resultado = 0;

printf("Digite o x inicial:");
scanf("%f", &x1);
printf("Digite o x final:");
scanf("%f", &x);
printf("Digite o y inicial:");
scanf("%f", &y1);
printf("Digite o y final:");
scanf("%f", &y);

float xy = (y - y1)/(x - x1);
//cout<< xy;

resultado = y1 + (xy) * (- x1);
//cout<< resultado;
printf("\n");

ux(resultado, xy, matriz, i);

printf("A formula u(x) encontrada e: %.3f + %.3f * x \n", resultado, xy);

    imprime(i, 3, matriz);
    printf("\n");

dx(matriz, i);

printf("A matriz completa:\n");

    imprime(i, 4, matriz);
    printf("\n");

    float dxt;
dxt = dtotal(matriz, i);
 
printf("O valor de D: %.3f\n", dxt);

printf("\n");
printf("Segunda Tentativa\n");
printf("Digite o x inicial:");
scanf("%f", &x1);
printf("Digite o x final:");
scanf("%f", &x);
printf("Digite o y inicial:");
scanf("%f", &y1);
printf("Digite o y final:");
scanf("%f", &y);

xy = (y - y1)/(x - x1);
//cout<< xy;

resultado = y1 + (xy) * (- x1);
//cout<< resultado;
printf("\n");

ux(resultado, xy, matriz, i);

printf("A formula u(x) encontrada e: %.3f + %.3f * x \n", resultado, xy);

    imprime(i, 3, matriz);
    printf("\n");

dx(matriz, i);

printf("A matriz completa:\n");

    imprime(i, 4, matriz);
    printf("\n");

float dxt2;
dxt2 = dtotal(matriz, i);
 
printf("O valor de D: %.3f\n", dxt2);

if(dxt < dxt2){
printf("O melhor modelo e: %.3f ", dxt);
}
else{
printf("O melhor modelo e: %.3f ", dxt2);
}

return 0;
}

Comentários

  1. Boa noite você teria um código em C++ de regressão não linear. Tenho uma função com 5 parâmetros que preciso ajustar aos dados medidos, ou seja usar a minimização do erro.
    Por favor agradeço se me ajudar

    ResponderExcluir

Postar um comentário