Программа выводит слишком большие числа - C (СИ)
Формулировка задачи:
Здесь реализован метод наименьших квадратов для нахождения коэффициентов уравнений
сама лаба № 3 посмотрите пожалуйстаааа
#include <stdio.h>
#include <math.h>
#include <conio.h>
double f(double A, double B, double x)
{
return (x/(A*x+B));
}
int main()
{
float A,B;
const int N=10;
int n=10,i;
float t,c,v,k,g;
float x[N]= {12,8.5,34,12.1,17.9,22.4,1.7,34,15.1,17.4};
float y[N]= {0.1,12.5,35.2,5.6,16.6,24.6,0.3,1.9,10.1,16.6};
float z[N];
float q[N];
t=c=v=k=0;
for (i=0; i<N; i++)
{
q[i]=x[i]/y[i];
z[i]=x[i];
t+=z[i];
c+=q[i];
v+=z[i]*z[i];
k+=q[i]*z[i];
A=(n*k-t*c)/(n*v-t*t);
B=(c-A*t)/n;
g+=(f(x[i],A,B)-y[i])*(f(x[i],A,B)-y[i]);
}
printf("\ny=x/(%f*x+%f)\n g=%f",A,B,g);
getch();
}Решение задачи: «Программа выводит слишком большие числа»
textual
Листинг программы
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#define N 10
double f(double A, double B, double x)
{
return (x/(A*x+B));
}
int main(void)
{
float A, B;
int n = 10, i;
float t, c, v, k, g;
float z[N];
float q[N];
// float x[N] = { 12, 8.5, 34, 12.1, 17.9, 22.4, 1.7, 34, 15.1, 17.4 };
// float y[N] = { 0.1, 12.5, 35.2, 5.6, 16.6, 24.6, 0.3, 1.9, 10.1, 16.6 };
// float x[N] = { 18.1, 15.1, 15.5, 17.9, 29.3, 38.4, 16.8, 34.1, 10.0, 23.6 };
// float y[N] = { 29.2, 36.0, 33.3, 16.6, 35.1, 44.2, 9.4, 35.7, 24.2, 24.8 };
float x[N];
float y[N];
srand(time(NULL));
for (i = 0; i < N; ++i)
{
x[i] = rand() / (1.0 + RAND_MAX) * 50;
y[i] = f(0.2, 0.7, x[i]) + rand() / (1.0 + RAND_MAX) * 0.05;
}
t = c = v = k = g = 0;
for (i = 0; i < N; i++)
{
q[i] = x[i]/y[i];
z[i] = x[i];
t += z[i];
c += q[i];
v += z[i] * z[i];
k += q[i] * z[i];
}
A = (n*k - t*c) / (n*v - t*t);
B = (c - A*t) / n;
for (i = 0; i < N; i++)
{
float e;
e = f(A, B, x[i]) - y[i];
printf("x=%f, y=%f, f=%f, e^2=%f\n", x[i], y[i], f(A, B, x[i]), e*e);
g += e * e;
}
printf("\ny = x / (%f*x + %f)\ng = %f\n", A, B, g);
getch();
return 0;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы:
, , , , . - Определяем массив z и q, а также переменные A, B, t, c, v, k, g. Значения переменных A и B пока не определены.
- Задаем размер массива N = 10.
- Определяем функцию f(double A, double B, double x), которая будет использоваться в основной программе.
- В основной программе инициализируем переменные A, B, n, i, а также массивы x и y размером N.
- Задаем начальные значения для x и y, либо позволяем компьютеру сгенерировать их случайным образом.
- Используем цикл for для заполнения массива x и y значениями.
- Вычисляем значения t, c, v, k, g и инициализируем их нулями.
- Используем второй цикл for для вычисления значений q и z, а также для обновления значений t, c, v, k, g.
- Вычисляем значения A и B, используя формулы из постановки задачи.
- Используем цикл for для вычисления значений e для каждого элемента массива x и y, а также для обновления значения g.
- Выводим результаты на экран.
- Выводим значения A, B, g.
- Ждем нажатия клавиши для завершения программы.
- Возвращаем 0, чтобы указать, что программа успешно завершилась.