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;
}
#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;
}
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.
ResponderExcluirPor favor agradeço se me ajudar