Программа выводит слишком большие числа - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здесь реализован метод наименьших квадратов для нахождения коэффициентов уравнений
#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();
}
сама лаба № 3 посмотрите пожалуйстаааа

Решение задачи: «Программа выводит слишком большие числа»

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;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы: , , , , .
  2. Определяем массив z и q, а также переменные A, B, t, c, v, k, g. Значения переменных A и B пока не определены.
  3. Задаем размер массива N = 10.
  4. Определяем функцию f(double A, double B, double x), которая будет использоваться в основной программе.
  5. В основной программе инициализируем переменные A, B, n, i, а также массивы x и y размером N.
  6. Задаем начальные значения для x и y, либо позволяем компьютеру сгенерировать их случайным образом.
  7. Используем цикл for для заполнения массива x и y значениями.
  8. Вычисляем значения t, c, v, k, g и инициализируем их нулями.
  9. Используем второй цикл for для вычисления значений q и z, а также для обновления значений t, c, v, k, g.
  10. Вычисляем значения A и B, используя формулы из постановки задачи.
  11. Используем цикл for для вычисления значений e для каждого элемента массива x и y, а также для обновления значения g.
  12. Выводим результаты на экран.
  13. Выводим значения A, B, g.
  14. Ждем нажатия клавиши для завершения программы.
  15. Возвращаем 0, чтобы указать, что программа успешно завершилась.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.5 из 5
Похожие ответы