Программа выводит слишком большие числа - 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, чтобы указать, что программа успешно завершилась.

ИИ для рефератов и докладов


  • Экспорт Word по ГОСТу
  • Минимум 80% уникальности текста
  • Поиск релевантных источников в интернете
  • Готовый документ за 2 минуты

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

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