[問題]compile過了但執行一半時出現error(附程式)
我的 一個作業 要找出eq的根
固定一個x 將根(y)帶入 判斷y是否為解
compile 時沒問題
但在run 時 跑到一半時(還不到設到的x) 它在出現"error 請按任意鍵"
我有對過 前面跑出來的答案是對的 但它無法跑到我要的X
但直接算那個最後停住的X 可以出現解(y)且是正確的
我想不知道是不是跟電腦有關西嗎? 我的筆電有五年的歷史了><
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double test(void);
double fun(double,float);
void loop(float,double,double,double,double);
double max(double,double);
double dee(double,float);
double dii(double,float);
int main()
{ int i;
float x;
double y[100000],eq2,eq1;
//------------------
FILE *fptr; //開啟檔案
if((fptr=fopen("root.txt","w"))==NULL)
{
printf("error");
system("pause");
}
//-----------------------
// y的初始直 並設定要帶入的y值 範圍0.001~100 固定一個x 將y值帶入 判斷y是否為
eq=0的解
y[0]=0.001;
for(i=0;i<100000;i++)
{y[i+1]=y[i]+0.001;}
x=0.01; //x的初始值
while(x<10.0)//x的終點
{ printf("x=%f\t",x);
fprintf(fptr,"%f\t",x);
for(i=0;i<100000;i++)//一一將y值帶入
{
eq1=fun(y[i],x);
eq2=fun(y[i+1],x);
if((eq1*eq2)<=0.0)//兩相鄰的y值 使eq位在一正一負 則可找出解
{
if(fabs(eq1)<=pow(10.0,-10))
{ fprintf(fptr,"a=%e\t",y[i]);}
else
{loop(x,y[i],y[i+1],eq1,eq2);}//找出較精準的y值
}
}
printf("\n");
fprintf(fptr,"\n");
x=x+0.01;
}
system("pause");
return 0;
}
double fun(double y,float x)
{
float pi,angle,a,b,wpi,wpe,we,wi,ck,ik,ek;
double de,di,d1,d2,d3,d4,d5,d6,eq;
pi=4*atan(1);
angle=pi/4;
a=cos(angle);
b=sin(angle);
wpi=1000.0;
wpe=42850;
we=1836;
wi=1.0;
ck=10000.0*x;
ik=0.2*x;
ek=42.0*x;
de=y*y*(y*y-we*we)-ek*ek*(y*y-we*we*a*a);
di=y*y*(y*y-wi*wi)-ik*ik*(y*y-wi*wi*a*a);
d1=1.0-wpe*wpe*(y*y-we*we*a*a)/de-wpi*wpi*(y*y-wi*wi*a*a)/di;
d2=1.0-(ck*ck)/(y*y)-wpe*wpe*(y*y-ek*ek-we*we*b*b)/de-wpi*wpi*(y*y-ik*ik-wi*wi*b*b)/di;
d3=1.0-(ck*ck)/(y*y)-wpe*wpe*(y*y-ek*ek)/de-wpi*wpi*(y*y-ik*ik)/di;
d4=wpe*wpe*we*we*a*b/de+wpi*wpi*wi*wi*a*b/di;
d5=wpe*wpe*y*we*b/de-wpi*wpi*y*wi*b/di;
d6=wpe*wpe*we*a*(y*y-ek*ek)/(y*de)-wpi*wpi*wi*a*(y*y-ik*ik)/(di*y);
eq=d1*d2*d3-2.0*d4*d5*d6-d3*d4*d4-d2*d5*d5-d1*d6*d6;
return eq;
}
void loop(float x,double y1,double y2,double eq1,double eq2)
{ int i;
double y3,eq3,c,di,cc,de;
//------------------
FILE *fptr; //開啟檔案
if((fptr=fopen("root.txt","w"))==NULL)
{
printf("error");
system("pause");
}
//-----------------------
// 因為分母也有y值 找出y使分母=0 (他會使eq趨向無限大)這是不要解 所以y1右邊的點
涮出的eq的絕對值會大於y1
c=fabs(fun(y1+0.000001,x));
cc=fabs(fun(y1,x));
de=(dee(y1,x));/
di=(dii(y1,x));
if(di>=0.00001 && de>=0.00001 && c-cc<0.0) /
{
y3=y1+0.01*fabs(eq1)/(fabs(eq1)+fabs(eq2));
fprintf(fptr,"b=%f\t",y3);
printf("b=%f\t",y3);
}
}
double dee(double y,float x)
{
float we,ek,a;
double de;
we=1836.0;
ek=42.0*x;
a=cos(atan(1)); //pi/4
de=y*y*(y*y-we*we)-ek*ek*(y*y-we*we*a*a);
return fabs(de);
}
double dii(double y,float x)
{
float wi,ik,a;
double di;
wi=1.0;
ik=0.2*x;
a=cos(atan(1)); //pi/4
di=y*y*(y*y-wi*wi)-ik*ik*(y*y-wi*wi*a*a);
return fabs(di);
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.138.128.123
→
09/27 10:15, , 1F
09/27 10:15, 1F
推
09/27 10:31, , 2F
09/27 10:31, 2F
→
09/27 10:32, , 3F
09/27 10:32, 3F
※ 編輯: scws 來自: 140.114.229.88 (09/27 15:18)
※ 編輯: scws 來自: 140.114.229.88 (09/27 15:48)
推
09/27 18:06, , 4F
09/27 18:06, 4F
→
09/27 18:07, , 5F
09/27 18:07, 5F
→
09/27 18:08, , 6F
09/27 18:08, 6F
→
09/27 18:08, , 7F
09/27 18:08, 7F
推
09/27 18:12, , 8F
09/27 18:12, 8F
→
09/27 18:12, , 9F
09/27 18:12, 9F
→
09/27 18:13, , 10F
09/27 18:13, 10F
→
09/27 19:28, , 11F
09/27 19:28, 11F
→
09/27 19:31, , 12F
09/27 19:31, 12F
推
09/27 19:40, , 13F
09/27 19:40, 13F
→
09/27 19:41, , 14F
09/27 19:41, 14F
→
09/27 19:41, , 15F
09/27 19:41, 15F
→
09/27 19:42, , 16F
09/27 19:42, 16F
→
09/27 19:42, , 17F
09/27 19:42, 17F
→
09/27 19:43, , 18F
09/27 19:43, 18F
→
09/27 19:44, , 19F
09/27 19:44, 19F