寒い とても 寒い
スズキです
課題のプログラムができたのでアップしておく
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define N 121
double mean(double *a);
double correlate(double *x,double *y);
double lsm(double *x,double *y);
int main(void)
{
int i;
double x[N],y[N],cor;
FILE *fp;
if((fp = fopen("soukandata.dat","r"))== NULL){
printf("ファイルがおーぷんできません ばーか\n");
}else{
for (i=0;i<N;i++) fscanf(fp,"%lf%lf",&x[i],&y[i]);
}
cor=correlate(x,y);
lsm(x,y);
printf("相関係数:%lf\nR^2:%lf",cor,pow(cor,2));
return(0);
}
double mean(double *a)
{
double m=0;
int i;
for(i=0;i<N;i++) m += a[i];
m /= N;
return(m);
}
double correlate(double *x,double *y)
{
double c=0,dd=0,dx=0,dy=0,ax,ay;
int i;
ax=mean(x);
ay=mean(y);
for(i=0;i<N;i++){
dd = dd +((x[i]-ax)*(y[i]-ay));
dx = dx + pow(x[i]-ax,2);
dy = dy + pow(y[i]-ay,2);
}
c=dd/(sqrt(dx)*sqrt(dy));
return(c);
}
double lsm(double *x,double *y){
int i;
double a,b,sx=0,sy=0,xx=0,xy=0;
for(i=0;i<N;i++){
sx += x[i];
sy += y[i];
xx += pow(x[i],2);
xy += x[i]*y[i];
}
a=((N*xy)-sx*sy)/((N*xx)-pow(sx,2));
b=(xx*sy-xy*sx)/(N*xx-pow(sx,2));
printf("近似曲線 y=%lf x + %lf\n",a,b);
return(0);
}
説明
mean(double *a) 平均を求める関数
coreelate(double *x,double *y) x,yに格納された値の相関を求める関数
lsm(double *x double *y) 近似曲線を求める関数
求める直線の式は切片と傾きの2つの値が必要なので2つの値を返す必要があるかもしれないけど2つ返すがわからないし切片と傾きを別々に関数でわけるのが面倒だったので関数内で表示させる仕様に
Excelとのデータがあったのでプログラムとして成功 課題終了
少し悦に浸る
おつかれさまです