線形最小2乗法と直接探索法の併用により、あるデータを最小2乗近似によって係数を求めるプログラムを作りました。
プログラムを実行したところ以下の警告が出て悩んでいます。
114行目 互換性のないポインタ型からの引数 1 個の `sweep' を渡しますです
114行目 互換性のないポインタ型からの引数 5 個の `sweep' を渡しますです
分りやすいように114行目のところに@がつけてあります。
どなたかご指摘お願いします。
#include<stdio.h>
#include<math.h>
#define eps 1.e-5
void sweep(double *,double *,int,int,int *,int);
void DSO(double *,double *,int *,double *,double *,int,int);
void FUN(double *,double *,double *,int,double *,int *);
int main(void)
{
double a[1],da[1],x[7],y[7];
int i,n,delta[1];
scanf("%d",&n);
for(i=0;i<n;++i) scanf("%lf %lf",&x[i],&y[i]);
scanf("%lf %lf",&a[0],&da[0]);
printf("Iteration b(1) b(2) b(3) a f\n");
DSO(a,da,delta,x,y,1,n);
}
/*DSO*/
void DSO(double *pa,double *pda,int *pdelta,double *px,double *py,int m,int n)
{
double ak,akp,akm,f0,fp,fm;
int k,j,iteration=0;
for(k=0;k<m;++k){
*(pdelta+k)=1;
}
FUN(pa,px,py,n,&f0,&iteration);
do{
j=0;
for(k=0;k<m;++k){
ak=*(pa+k);
akp=*(pa+k)+*(pda+k);
akm=*(pa+k)-*(pda+k);
if(*(pdelta+k)==1){
*(pa+k)=akp;
FUN(pa,px,py,n,&fp,&iteration);
if(f0>fp){
*(pdelta+k)=1;
f0=fp;
break;
}
else{
*(pa+k)=akm;
FUN(pa,px,py,n,&fm,&iteration);
if(f0>fm){
*(pdelta+k)=-1;
f0=fm;
break;
}
else{
j++;
*(pa+k)=ak;
}
}
}
else{
*(pa+k)=akm;
FUN(pa,px,py,n,&fm,&iteration);
if(f0>fm){
*(pdelta+k)=-1;
f0=fm;
break;
}
else{
*(pa+k)=akp;
FUN(pa,px,py,n,&fp,&iteration);
if(f0>fp){
*(pdelta+k)=1;
f0=fp;
break;
}
else{
j++;
*(pa+k)=ak;
}
}
}
}
}while(j!=m);
printf("*** SOLVED ***\n");
FUN(pa,px,py,n,&f0,&iteration);
return;
}
/*Function for sum of square errors*/
void FUN(double *pa,double *px,double *py,int n,double *pf,int *pi)
{
double b[3],c[3][4],iwork[3],t[3],yi;
int i,ILL;
c[0][0]=n;
c[0][1]=0.;
c[0][2]=0.;
c[0][3]=0.;
c[1][1]=0.;
c[1][2]=0.;
c[1][3]=0.;
c[2][2]=0.;
c[2][3]=0.;
for(i=0;i<n;i++){
c[0][1]+=log10(*(px+i));
c[1][1]+=log10(*(px+i))*log10(*(px+i));
c[0][2]+=pow(log10(*(px+i)),*(pa+0));
c[1][2]+=pow(log10(*(px+i)),*(pa+0)+1.);
c[2][2]+=pow(log10(*(px+i)),2.**(pa+0));
c[0][3]+=*(py+i);
c[1][3]+=*(py+i)*log10(*(px+i));
c[2][3]+=*(py+i)*pow(log10(*(px+i)),*(pa+0));
}
c[1][0]=c[0][1];
c[2][0]=c[0][2];
c[2][1]=c[1][2];
sweep(c,t,3,4,iwork,ILL); @114行目
for(i=0;i<3;++i){
b[i]=c[i][3];
}
*pf=0.;
for(i=0;i<n;++i){
yi=b[0]+b[1]*log10(*(px+i))+b[2]*pow(log10(*(px+i)),*(pa+0));
*pf+=(*(py+i)-yi)*(*(py+i)-yi);
}
printf("%6d %12.3e%12.3e%12.3e%7.2f%11.2e\n",
*pi,b[0],b[1],b[2],*(pa+0),*pf);
++*pi;
return;
}
/*Gauss-Jordan method*/
void sweep(double *pa,double *pt,int n,int m,int *piwork,int ILL)
{
double max,w;
int i,j,k,iw,p,q;
for(i=0;i<n;++i){
max=fabs(*(pa+m*i));
for(j=0;j<n;++j){
if(max<fabs(*(pa+m*i+j)))max=fabs(*(pa+m*i+j));
}
for(j=0;j<m;++j) *(pa+m*i+j)=*(pa+m*i+j)/max;
}
for(j=0;j<n;++j){
max=fabs(*(pa+j));
for(i=0;i<n;++i){
if(max<fabs(*(pa+m*i+j)))max=fabs(*(pa+m*i+j));
}
*(pt+j)=max;
for(i=0;i<n;++i) *(pa+m*i+j)=*(pa+m*i+j)/max;
}
for(i=0;i<n;++i){
*(piwork+i)=i;
}
for(k=0;k<n;++k){
max=fabs(*(pa+m*k+k));
p=k;
q=k;
for(j=k;j<n;++j){
for(i=k;i<n;++i){
if(max<fabs(*(pa+m*i+j))){
max=fabs(*(pa+m*i+j));
p=i;
q=j;
}
}
}
if(max<=eps){
ILL=1;
printf("MATRIX IS ILL\n");
return;
}
for(i=0;i<n;++i){
w=*(pa+m*i+k);
*(pa+m*i+k)=*(pa+m*i+q);
*(pa+m*i+q)=w;
}
for(j=k;j<m;++j){
w=*(pa+m*k+j);
*(pa+m*k+j)=*(pa+m*p+j);
*(pa+m*p+j)=w;
}
i=*(piwork+k);
*(piwork+k)=*(piwork+q);
*(piwork+q)=i;
for(j=k+1;j<m;++j){
*(pa+m*k+j)=*(pa+m*k+j)/(*(pa+m*k+k));
}
for(i=0;i<n;++i){
if(i!=k){
for(j=k+1;j<m;++j){
*(pa+m*i+j)=*(pa+m*i+j)-*(pa+m*i+k)*(*(pa+m*k+j));
}
}
}
}
for(j=n;j<m;++j){
for(i=0;i<n;++i){
iw=*(piwork+i);
*(pa+m*iw+n-1)=*(pa+m*i+j);
}
for(i=0;i<n;++i){
*(pa+m*i+j)=*(pa+m*i+n-1)/(*(pt+i));
}
}
return;
}
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
関数の実体と呼び出し側とで引数の型に食い違いがあるってことは、
設計がきちんとなされてないってことですね。
設計をやり直してみてはどうでしょうか。
ソースコードに注釈(コメント)が全くないため、
部外者には何をしているかほとんど読み取れないと思います。
使い捨てのプログラムでないのであれば、後から読み返したりメンテナンスしたりするときの
役に立つよう、適切な注釈を入れてみてはどうでしょうか。
要素数が1の配列って、どういう意味があるんでしょうか。
配列にしなくてよいのでは?
ありがとうございます。
分かりやすく注釈を入れて、もう一度つくり直すことにします。
再度投稿する時がありましたらそのときはよろしくお願いします。
No.1
- 回答日時:
プログラムの中身は見てないけど,114行目のsweep(c,t,3,4,iwork,ILL);の
1番目の引数cは
double c[3][4]
と定義されているのに,関数の方では
double *pa
とはどういうこと?
5番目の引数iworkは
double iwork[3]
と定義されているのに,関数の方では
int *piwork
とはどういうこと?
ありがとうございます。
確かにその変な部分を直した警告が消えました。
しかし、ちゃんと実行されないようなので、まだ、変なところがあるようです。
もう一度つくり直すことにします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
float型とdouble型の変数の違い...
-
プログラムでの数字につく”f”の...
-
C 開放してるのにエラー(doubl...
-
C言語を実行すると-infが出てき...
-
たくさんの数の平均を求める方...
-
doubleの変数にintとintの割り...
-
2次方程式の解を求めるプログ...
-
C言語
-
三角形OABの面積を求めるプ...
-
C言語 関数プロトタイプ宣言の...
-
c言語のプログラミングについて...
-
c言語で、繰り返し文の中で、0....
-
関数におけるif文とreturn文に...
-
C言語の型による処理速度の違い
-
c言語のコンパイルエラー canno...
-
C言語で直角三角形の斜辺を求め...
-
C++で外積
-
double型とint型で三分の一乗の...
-
EXE1→DLL→EXE2数値を受け渡す方法
-
C言語初心者 構造体 課題について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
float型とdouble型の変数の違い...
-
doubleの変数にintとintの割り...
-
C言語を実行すると-infが出てき...
-
C 開放してるのにエラー(doubl...
-
至急です! マクロ定義で #defi...
-
c言語で、繰り返し文の中で、0....
-
関数におけるif文とreturn文に...
-
C言語 関数プロトタイプ宣言の...
-
C言語初心者 構造体 課題について
-
C言語の型による処理速度の違い
-
Cで3乗根を求める方法
-
C言語で-23乗を取り扱うには
-
2分法で方程式の複数の解を自...
-
doubleは常に%lfとするべきなのか
-
c言語のコンパイルエラー canno...
-
C言語で直角三角形の斜辺を求め...
-
C言語のプログラムで#include<m...
-
int とdoubleの比較
-
C++で外積
おすすめ情報