|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
02.06.2016, 18:55 | #1 |
Регистрация: 31.05.2016
Сообщений: 9
|
C++ Проверка программы
Здравствуйте. Мне дана задача, найти параметры (С1, С2, С3) аппроксимирующей функции y= С1*f1(x)+С2*f2(x)+ С3*f3(x), пользуясь методом наименьших квадратов. А поиск параметром осуществить, по методу Гаусса.
xi- 0.79;1.57;2.36;3.12;3.81 yi- 2.50;1.20;1.12;2.25;4.28 φ1(x)- 1 φ2(x)- x φ3(x)- x^2 Моя программа: #include <stdio.h> #include <conio.h> #include <math.h> #include <stdlib.h> #define n 5 #define m 3 void vvodMatrX(float X[n]); void vvodMatrY(float Y[n]); void matrAB(float A[m][m],float B[m],float x[n],float y[n]); float fi(float x,int k); void vmat (float A[m][m]); void vvek(float B[m]); void gauss(float A[m][m],float B[m],float C[m]); void otklonenie(float G[n],float X[n]); void tabl(float X[n],float Y[n],float C[m],float G[n]); int main() { int i ,k,j,max; float A[m][m],B[m],X[5]={0.79, 1.57, 2.36, 3.12, 3.81}, Y[5]={2.5, 1.2, 1.12, 2.25, 4.28},C[m],G[n]; clrscr(); matrAB(A,B,X,Y); printf("matrica A: "); vmat (A); printf("\nvektor B:\n"); vvek(B); gauss(A,B,C) ; printf("\nF=%4.4f+%4.4f(x)+%4.4f((3 *x*x)-1) \n",C[0],C[1],C[2]); printf("\nkoefficienti C0=%5.4f, C1=%5.4f, C2=%5.4f \n",C[0],C[1],C[2]); printf("\nvicheslennie znacheniya\n"); vivodTabl(X,Y,C,G,i,F); approks(G,J); printf("\nznachenie kriteria approksimacii: \n"); printf(" J= %7.4f ",J); otklonenie(G,X,g,max); printf("\nMax. po modulu otklonenie:\n"); printf("max|g[i]|= %5.4f pri x= x[%d]= %5.4f \n",g,max+1,X[max]); getch(); return 0; } void vvodMatrX(float X[n]) { int i; printf("\n"); for(j=0;j<m;j++) scanf("%9.4f ",&X[i]); } void vvodMatrY(float Y[n]) { int i; printf("vvod y:\n"); for (i=0; i<n; i++) scanf("%f", &Y[i]); } void vvodMatrY(float Y[n]) { int i; printf("vvod y:\n"); for (i=0; i<n; i++) scanf("%f", &Y[i]); } void matrAB(float A[m][m],float B[m],float x[n],float y[n]) { int i,j,l; float S; for(i=0;i<m;i++) { for(j=0;j<m;j++) { S=0; for(l=0;l<n;l++) S=S+fi(x[l],i)*fi(x[l],j); A[i][j]=S; } S=0; for(l=0;l<n;l++) S=S+ y[l]*fi(x[l],i); B[i]=S; } } void vivodmatr(float A[m][m]) { int i,j; for(i=0;i<m;i++) { printf("\n"); for(j=0;j<m;j++) printf("%9.4f",A[i][j]); } printf("\n"); } void vivodvekt(float B[m]) { int i; for(i=0;i<m;i++) printf("%9.4f",B[i]); } void gauss(float A[m][m],float B[m],float C[m]) { int i,k,j; float sum; for (i=0;i<m-1;i++) { for (k=i+1;k<m;k++) { C[i]=A[k][i]/A[i][i]; A[k][i]=0; for (j=i+1;j<m;j++) A[k][j]=A[k][j]-C[i]*A[i][j]; B[k]=B[k]-C[i]*B[i]; } } for (i=m-1;i>=0;i--) { sum=0; for (j=i+1;j<m;j++) sum=sum+A[i][j]*C[j]; C[i]=(B[i]-sum)/(A[i][i]); } } void tabl(float X[n],float Y[n],float C[m],float G[n],int &i, float F[n]) { for(i=0;i<n;i++) { F[i]=C[0]+C[1]*( X[i])+C[2]*((3*X[i]*X[i])-1); G[i]=Y[i]-F[i]; } } void approks(float G[n],float &J) { int i; J=0; for(i=0;i<n;i++) J=J+G[i]*G[i]; } void otklonenie(float G[n],float X[n]) { int i,max; float g; g=fabs(G[0]); max=0; for(i=1;i<n;i++) if (fabs(G[i])>g) { g=fabs(G[i]); max=i; } } float fi(float x,int k) { if(k==0) return (1); else if(k==1) return (x); else if(k==2) return ((3*x*x)-1); } void vivodTabl(float X[n],float Y[n],float C[m],float G[n], int &i, float F[n]) { printf("i X[i] Y[i] F[i] G[i]\n"); for(i=0;i<n;i++) printf("%i %5.4f %5.4f %5.4f %5.4f\n",i+1,X[i],Y[i],F[i],G[i]); } Так же выводится все должно в main.Т.е не отдельно в каждом, а вместе. И меня интересует,правильно ли составлена программа или нет? И в чем ошибки. |
03.06.2016, 00:13 | #2 |
Участник клуба
Регистрация: 14.05.2016
Сообщений: 1,793
|
Что то не очень правильно. Вот у меня повылазило ошибки
Не понятно почему матрицы (xi, yi) жестко задавать в программе, а не задаются с клавиатуры (ведь есть ф-ции void vvodMatrX). А после этого непонятно зачем нужны: void vvodMatrX(float X[n]) void vvodMatrY(float Y[n]) void vvodMatrY(float Y[n]) - 2-й раз функция зачем то таже самая организована. vivodTabl Если Вы работает в С++, зачем использовать printf и scanf (аналоги cout, cin). Вас так учили? Пока всё - я особо в код не вдавался. p.s.: может показать Вам как пользоваться отладчиком? (для поиска ошибок) Последний раз редактировалось ura_111; 03.06.2016 в 00:26. |
03.06.2016, 09:29 | #3 |
Регистрация: 31.05.2016
Сообщений: 9
|
Спасибо большое, что ответили.
Да,нас так учили. Я исправила, но теперь в ошибках мне пишет "ld returned 1 exit status" Почему это может быть? main вроде правильно написано. |
03.06.2016, 09:31 | #4 |
Участник клуба
Регистрация: 14.05.2016
Сообщений: 1,793
|
Приводите код - будем общаться конкретней по нему,
а то я не настолько профессионален чтобы по одному виду сообщения сказать что не так. Последний раз редактировалось ura_111; 03.06.2016 в 09:34. |
03.06.2016, 09:59 | #5 |
Регистрация: 31.05.2016
Сообщений: 9
|
Вот он
#include <stdio.h> #include <conio.h> #include <math.h> #include <stdlib.h> #define n 5 #define m 3 void vvodMatrX(float X[n]); void vvodMatrY(float Y[n]); void matrAB(float A[m][m],float B[m],float x[n],float y[n]); void vivodmatr(float A[m][m]); void vivodvekt(float B[m]); void gauss(float A[m][m],float B[m],float C[m]); void tabl(float X[n],float Y[n],float C[m],float G[n], int &i, float F[n]); void approks(float G[n],float &); void otklonenie(float [],float X[n],float &,int &max); float fi(float x,int k); void vivodTabl(float X[n],float Y[n],float C[m],float G[n], int &i, float F[n]); int main() { int i ,k,j,max; float A[m][m],B[m],X[n],Y[n],C[m],G[n],J,g,F[n]; vvodMatrX(X); vvodMatrY(Y); matrAB(A,B,X,Y); printf("matrica A:\n "); vivodmatr(A); printf("\nnvektor B:\n"); vivodvekt(B); gauss(A,B,C); tabl(X,Y,C,G,i,F); printf("\nF=%4.4f+%4.4f(x)+%4.4f((3 *x*x)-1) \n",C[0],C[1],C[2]); printf("\nkoefficienti C0=%5.4f, C1=%5.4f, C2=%5.4f \n",C[0],C[1],C[2]); printf("\nvicheslennie znacheniya\n"); vivodTabl(X,Y,C,G,i,F); approks(G,J); printf("\nznachenie kriteria approksimacii: \n"); printf(" J= %7.4f ",J); otklonenie(G,X,g,max); printf("\nMax. po modulu otklonenie:\n"); printf("max|g[i]|= %5.4f pri x= x[%d]= %5.4f \n",g,max+1,X[max]); getch(); } void vvodMatrX(float X[n]) { int i; printf("vvod x:\n"); for (i=0; i<n; i++) scanf("%f", &X[i]); } void vvodMatrY(float Y[n]) { int i; printf("vvod y:\n"); for (i=0; i<n; i++) scanf("%f", &Y[i]); } void matrAB(float A[m][m],float B[m],float x[n],float y[n]) { int i,j,l; float S; for(i=0;i<m;i++) { for(j=0;j<m;j++) { S=0; for(l=0;l<n;l++) S=S+fi(x[l],i)*fi(x[l],j); A[i][j]=S; } S=0; for(l=0;l<n;l++) S=S+y[l]*fi(x[l],i); B[i]=S; } } void vivodmatr(float A[m][m]) { int i,j; for(i=0;i<m;i++) { printf("\n"); for(j=0;j<m;j++) printf("%9.4f",A[i][j]); } printf("\n"); } void vivodvekt(float B[m]) { int i; for(i=0;i<m;i++) printf("%9.4f",B[i]); } void tabl(float X[n],float Y[n],float C[m],float G[n],int &i, float F[n]) { for(i=0;i<n;i++) { F[i]=C[0]+C[1]*( X[i])+C[2]*((3*X[i]*X[i])-1); G[i]=Y[i]-F[i]; } } void approks(float G[n],float &J) { int i; J=0; for(i=0;i<n;i++) J=J+G[i]*G[i]; } void otklonenie( float G[n],float X[n],float &g, int &max) { int i; g=fabs(G[0]); max=0; for(i=0;i<n;i++) if (fabs(G[i])>g) { g=fabs(G[i]); max=i; } } float fi(float x,int k) { if(k==0) return (1); else if(k==1) return (x); else if(k==2) return ((3*x*x)-1); } void vivodTabl(float X[n],float Y[n],float C[m],float G[n], int &i, float F[n]) { printf("i X[i] Y[i] F[i] G[i]\n"); for(i=0;i<n;i++) printf("%i %5.4f %5.4f %5.4f %5.4f\n",i+1,X[i],Y[i],F[i],G[i]); } |
03.06.2016, 10:16 | #6 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,709
|
Код:
|
03.06.2016, 10:43 | #7 |
Участник клуба
Регистрация: 14.05.2016
Сообщений: 1,793
|
Вы писали: "...выводится всё должно в main..."
А сами выводите в отдельных функциях: void vivodvekt(float B[m]) void vivodmatr(float A[m][m]) void vivodTabl(float X[n],float Y[n],float C[m],float G[n], int &i, float F[n]) Вопрос: а вводить данные тоже надо в main? Функции: void vvodMatrX(float X[n]) void vivodmatr(float A[m][m]) |
03.06.2016, 10:45 | #8 |
Регистрация: 31.05.2016
Сообщений: 9
|
Извините,я не понимаю, что вы имеете виду под "реализовать". Ведь далее у меня идет в void A,B,C,X и Y
|
03.06.2016, 10:48 | #9 |
Участник клуба
Регистрация: 14.05.2016
Сообщений: 1,793
|
Он имел ввиду: Яна куда пропала функция gauss из 1-го листинга программы?
void gauss(float A[m][m],float B[m],float C[m]) { int i,k,j; float sum; for (i=0;i<m-1;i++) { for (k=i+1;k<m;k++) { C[i]=A[k][i]/A[i][i]; A[k][i]=0; for (j=i+1;j<m;j++) A[k][j]=A[k][j]-C[i]*A[i][j]; B[k]=B[k]-C[i]*B[i]; } } for (i=m-1;i>=0;i--) { sum=0; for (j=i+1;j<m;j++) sum=sum+A[i][j]*C[j]; C[i]=(B[i]-sum)/(A[i][i]); } } Сопоставь 1- й и 2- й твои листинги программы. Последний раз редактировалось ura_111; 03.06.2016 в 15:40. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Проверка на ошибку программы | Razdolbai | Помощь студентам | 1 | 13.11.2012 10:58 |
проверка программы | Frank63 | Паскаль, Turbo Pascal, PascalABC.NET | 5 | 07.10.2012 22:40 |
проверка программы | swat16 | Помощь студентам | 6 | 20.04.2012 10:30 |
проверка программы | PradoSV | Общие вопросы C/C++ | 0 | 14.12.2009 21:26 |
Проверка работы программы... | DimkinStd | Общие вопросы Delphi | 3 | 26.12.2006 13:24 |